📄 main.pas
字号:
unit Main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, DXClass, DXDraws, DirectX,pool, ExtCtrls, Buttons, Menus,unit1;
type
TMainForm = class(TDXForm)
DXDraw: TDXDraw;
DXTimer: TDXTimer;
OpenDialog: TOpenDialog;
MainMenu1: TMainMenu;
help: TMenuItem;
About1: TMenuItem;
Settings1: TMenuItem;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
SaveDialog1: TSaveDialog;
OpenDialog1: TOpenDialog;
N8: TMenuItem;
N9: TMenuItem;
N10: TMenuItem;
N11: TMenuItem;
N12: TMenuItem;
N800x6001: TMenuItem;
N640x4801: TMenuItem;
N320x2401: TMenuItem;
N4: TMenuItem;
procedure DXDrawInitialize(Sender: TObject);
procedure DXDrawFinalize(Sender: TObject);
procedure DXTimerTimer(Sender: TObject; LagCount: Integer);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure DXDrawInitializeSurface(Sender: TObject);
procedure DXDrawMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure DXDrawMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormCreate(Sender: TObject);
procedure About1Click(Sender: TObject);
procedure Settings1Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure N4Click(Sender: TObject);
procedure N5Click(Sender: TObject);
procedure N7Click(Sender: TObject);
procedure N8Click(Sender: TObject);
procedure DXDrawClick(Sender: TObject);
procedure N10Click(Sender: TObject);
procedure N11Click(Sender: TObject);
procedure N800x600x161Click(Sender: TObject);
procedure N800x6001Click(Sender: TObject);
procedure N640x4801Click(Sender: TObject);
procedure N320x2401Click(Sender: TObject);
// balls:tlist;
public
FileName: string;
Mesh,m2: IDirect3DRMMesh;
MeshFrame,kiy: IDirect3DRMFrame;
LightFrame,l2: IDirect3DRMFrame;
WrapType: D3DRMWRAPTYPE;
wrap: IDirect3DRMWrap;
balls:tlist;
al,bt,gm:real;
xo,yo,zo:real;
ballax:real;
mtab:ttable;
oldmx,oldmy:integer;
movbl:boolean;
eding:boolean;
power:real;
cameramode:byte;
procedure hidekiy;
procedure showkiy;
procedure rotatekiy(al:real);
function perpvec(x,y,z:real):real;
end;
var
MainForm: TMainForm;
implementation
uses Unit2;
{$R *.DFM}
function tmainform.perpvec(x,y,z:real):real;
var k,al,bt,phi,a,b,c,D:real ;
begin
k:=1/sqrt(x*x+y*y+z*z);
al:=k*(x+y);
bt:=z*k;
phi:=2;
a:=bt*bt-1;
b:=2*al*bt;
c:=al*al-phi;
D:=sqrt(b*b-4*a*c);
result:=(-b+D)/(2*a);
end;
procedure tmainform.rotatekiy(al:real);
begin
kiy.move(al);
if cameramode=3 then
begin
// dxdraw.camera.move(ballax+3.14/2);
dxdraw.camera.setposition(
dxdraw.scene ,
tball(mtab.balllist[0]).xpos -145+80*(-sin(ballax)),
-220,
tball(mtab.balllist[0]).ypos -65+80*(-cos(ballax)));
DXDraw.Camera.SetOrientation(DXDraw.Scene, 0, 0.35, 0.21, 0, 0, 1 );
dxdraw.camera.setrotation(DXDraw.Scene,0,1,0,1);
dxdraw.camera.move(ballax);
end;
ballax:=ballax+al;
end;
procedure tmainform.hidekiy;
begin
kiy.SetPosition(dxdraw.scene,0,0,10000);
end;
procedure tmainform.showkiy;
begin
// kiy.setposition(tball(mtab.balllist[0]).ballframe,0,0,0);
kiy.setposition(
dxdraw.scene ,
tball(mtab.balllist[0]).xpos -145+power*2*(-sin(ballax)),
0,
tball(mtab.balllist[0]).ypos -65+power*2*(-cos(ballax)));
kiy.setrotation(dxdraw.scene ,0,1,0,1);
dxdraw.camera.setrotation(dxdraw.scene ,0,1,0,1);
end;
procedure TMainForm.DXDrawInitialize(Sender: TObject);
var
Light, AmbientLight: IDirect3DRMLight;
MeshBuilder,mm2,m3,cube: IDirect3DRMMeshBuilder;
begin
ballax:=3.14/2;
oldmx:=0;
power:=1;
eding:=true;
cameramode:=1;
DXDraw.D3DRM.CreateFrame(DXDraw.Scene, LightFrame);
DXDraw.D3DRM.CreateFrame(DXDraw.Scene, MeshFrame);
DXDraw.D3DRM.CreateFrame(DXDraw.Scene, kiy);
DXDraw.D3DRM.CreateLightRGB(D3DRMLIGHT_DIRECTIONAL, 0.9, 0.9, 0.9, Light);
LightFrame.AddLight(Light);
DXDraw.D3DRM.CreateLightRGB(D3DRMLIGHT_AMBIENT, 0.3, 0.3, 0.3, AmbientLight);
DXDraw.Scene.AddLight(AmbientLight);
{ Frame position and posture setting }
DXDraw.Camera.SetPosition(DXDraw.Scene, xo, yo, zo);
DXDraw.Camera.SetOrientation(DXDraw.Scene, al, bt, gm, 0.0, -1.0, 0.0);
LightFrame.SetPosition(DXDraw.camera, -130, 0.0, 0);
LightFrame.Setorientation(DXDraw.Scene, 0,0.8,0.2,0,0,0.8);
LightFrame.Setrotation(DXDraw.Scene, 1,0.8,0.2,0.08);
DXDraw.Camera.Setrotation(DXDraw.Scene, 1, 0, 0, 0.3);
MeshFrame.SetPosition(DXDraw.Scene, 0.0, 0.0, 15);
MeshFrame.SetRotation(DXDraw.Scene, 0.5, 0.5, 1.0, 0.03);
{ Mesh making }
DXDraw.D3DRM.CreateMeshBuilder(MeshBuilder);
DXDraw.D3DRM.CreateMeshBuilder(mm2);
DXDraw.D3DRM.CreateMeshBuilder(m3);
DXDraw.D3DRM.CreateMeshBuilder(cube);
if FileName='' then
FileName := ExtractFilePath(Application.ExeName)+'table.x';
ChDir(ExtractFilePath(FileName));
MeshBuilder.Load(PChar(FileName), nil, D3DRMLOAD_FROMFILE, nil, nil);
// MeshBuilder.save(PChar(FileName), D3DRMXOF_COMPRESSED,7);
MeshFrame.AddVisual(meshbuilder);
M3.Load(PChar('kiy.x'), nil, D3DRMLOAD_FROMFILE, nil, nil);
Mm2.Load(PChar('surface.x'), nil, D3DRMLOAD_FROMFILE, nil, nil);
MeshFrame.AddVisual(mm2);
meshframe.SetOrientation(dxdraw.Scene,0,0,1,0,1,0);
meshframe.Setrotation(meshframe,0,1,0,0.01);
mtab:=ttable.create(dxdraw);
kiy.AddVisual(m3);
kiy.setorientation(kiy,0.1,-1,0.1,0,0,-1);
meshframe.setrotation(dxdraw.scene,-1,0,0,0.1);
DXDraw.Camera.SetOrientation(DXDraw.Scene, 0, 0.35, 0.21, 0, 0, 1 );
dxdraw.camera.setrotation(DXDraw.Scene,0,1,0,1);
dxdraw.camera.move(3.14/2);
showkiy;
rotatekiy(3.141);
{ dxdraw.camera.SetRotation(dxdraw.Scene,1,0,0,0.4);
dxdraw.camera.move(-1);}
DXTimer.Enabled := True;
end;
procedure TMainForm.DXDrawFinalize(Sender: TObject);
begin
Wrap := nil;
Mesh := nil;
MeshFrame := nil;
DXTimer.Enabled := False;
end;
procedure TMainForm.DXDrawInitializeSurface(Sender: TObject);
begin
if doHardware in DXDraw.NowOptions then
DXDraw.D3DRMDevice.SetTextureQuality(D3DRMTEXTURE_LINEAR);
end;
procedure TMainForm.DXTimerTimer(Sender: TObject; LagCount: Integer);
var
s: string;
r: TRect;
begin
if not mtab.dead then hidekiy else showkiy;
// meshframe.Move(1 );
if eding then mtab.domove else mtab.repaint;
{ DXDraw.Camera.SetPosition(DXDraw.Scene, xo, yo, zo);
DXDraw.Camera.SetOrientation(DXDraw.Scene, al, bt, gm, 0.0, -1, 0);
}
case cameramode of
1:begin
DXDraw.Camera.SetPosition(DXDraw.Scene, 0, -350, 0);
DXDraw.Camera.SetOrientation(DXDraw.Scene, 0, 0.25, 0.01, 0.0, -1, 0);
end;
2:begin
DXDraw.Camera.SetPosition(DXDraw.Scene, 0, -320, -187);
DXDraw.Camera.SetOrientation(DXDraw.Scene, 0, 0.35, 0.21, 0.0, -1, 0);
end;
3:begin
rotatekiy(0);
{
dxdraw.camera.setposition(
dxdraw.scene ,
tball(mtab.balllist[0]).xpos -145+80*(-sin(ballax)),
-220,
tball(mtab.balllist[0]).ypos -65+80*(-cos(ballax)));}
end;
end;
{ lightframe.setposition(DXDraw.camera, xo, yo, zo);
lightframe.SetOrientation(DXDraw.Scene, al, bt, gm, 0.005, 0.01, 0.5);}
if not DXDraw.CanDraw then exit;
DXDraw.Viewport.ForceUpdate(0, 0, DXDraw.SurfaceWidth, DXDraw.SurfaceHeight);
DXDraw.Render;
s := Format('Power: %f', [power])+Format(' FPS: %d', [dxtimer.framerate]);
r := DXDraw.Surface.ClientRect;
with DXDraw.Surface.Canvas do
begin
Brush.Style := bsClear;
Font.Color := clWhite;
Font.Size := 7;
DrawText(Handle, PChar(s), Length(s), r, DT_LEFT or DT_NOCLIP);
Release; { Indispensability }
end;
DXDraw.Flip;
end;
procedure TMainForm.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure movekiy;
var n:byte;
begin
for n:=0 to round(power*20) do
begin
kiy.setposition(
dxdraw.scene ,
tball(mtab.balllist[0]).xpos -145+n*(-sin(ballax)),
0,
tball(mtab.balllist[0]).ypos -65+n*(-cos(ballax)));
DXDraw.Viewport.ForceUpdate(0, 0, DXDraw.SurfaceWidth, DXDraw.SurfaceHeight);
DXDraw.Render;
DXDraw.Flip;
end;
for n:=10 downto 0 do
begin
kiy.setposition(
dxdraw.scene ,
tball(mtab.balllist[0]).xpos -145+2*n*power*(-sin(ballax)),
0,
tball(mtab.balllist[0]).ypos -65+2*n*power*(-cos(ballax)));
DXDraw.Viewport.ForceUpdate(0, 0, DXDraw.SurfaceWidth, DXDraw.SurfaceHeight);
DXDraw.Render;
DXDraw.Flip;
end;
end;
begin
{ Application end }
if Key=VK_ESCAPE then Close;
if key=vk_right then
begin
rotatekiy( -2*3.14159625/180);
end;
if key=vk_left then
begin
rotatekiy(2*3.14159625/180);
end;
if key=vk_space then
if mtab.dead then
begin
movekiy;
tball(mtab.balllist[0]).xv:=sin(ballax)*power*2;
tball(mtab.balllist[0]).yv:=cos(ballax)*power*2;
end;
if (key=vk_down) and (power<3) then power:=power+0.1;
if (key=vk_up) and (power>0.2) then power:=power-0.1;
{
if (ssAlt in Shift) and (Key=VK_RETURN) then
begin
DXDraw.Finalize;
if doFullScreen in DXDraw.Options then
begin
RestoreWindow;
DXDraw.Cursor := crDefault;
BorderStyle := bsSizeable;
DXDraw.Options := DXDraw.Options - [doFullScreen];
if n4.Checked then panel1.Visible:=true;
end else
begin
StoreWindow;
DXDraw.Cursor := crNone;
BorderStyle := bsNone;
DXDraw.Options := DXDraw.Options + [doFullScreen];
if n5.Checked then panel1.Visible:=true;
panel1.Visible:=false;
end;
DXDraw.Initialize;
end;}
end;
procedure TMainForm.DXDrawMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var xx,yy:integer;
begin
{caption:=floattostr(xo)+','+floattostr(yo)+','+floattostr(zo)+','+
floattostr(al)+','+floattostr(bt)+','+floattostr(gm)+',';
} {
caption:=floattostr(ballax);
rotatekiy((x-oldmx)/40);
oldmx:=x;
}
if movbl then
begin
xx:=-x+oldmx;
yy:=-y+oldmy;
oldmx:=x;
oldmy:=y;
end;
end;
procedure TMainForm.DXDrawMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
{ movbl:=not movbl;
oldmx:=x;
oldmy:=y;}
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
movbl:=false;
n2.click;
end;
procedure TMainForm.About1Click(Sender: TObject);
begin
aboutbox.ShowModal;
end;
procedure TMainForm.Settings1Click(Sender: TObject);
begin
eding:=false;
settings.showmodal;
eding:=true;
end;
procedure TMainForm.N2Click(Sender: TObject);
begin
cameramode:=1;
n2.checked:=true;
n3.checked:=false;
n4.checked:=false;
end;
procedure TMainForm.N3Click(Sender: TObject);
begin
cameramode:=2;
n3.checked:=true;
n2.checked:=false;
n4.checked:=false;
end;
procedure TMainForm.N4Click(Sender: TObject);
begin
cameramode:=3;
rotatekiy(0);
n4.checked:=true;
n3.checked:=false;
n2.checked:=false;
end;
procedure TMainForm.N5Click(Sender: TObject);
begin
n2.checked:=false;
n3.checked:=false;
end;
procedure TMainForm.N7Click(Sender: TObject);
begin
if savedialog1.execute then
mtab.savetofile(savedialog1.filename);
end;
procedure TMainForm.N8Click(Sender: TObject);
begin
// dxtimer.enabled:=false;
if opendialog1.execute then
begin
mtab.cleartab;
mtab.openfromfile(opendialog1.filename);
end;
end;
procedure TMainForm.DXDrawClick(Sender: TObject);
begin
/// if key=vk_down then
{ if mtab.dead then
begin
tball(mtab.balllist[0]).xv:=sin(ballax)*3;
tball(mtab.balllist[0]).yv:=cos(ballax)*3;
end; }
end;
procedure TMainForm.N10Click(Sender: TObject);
begin
close;
end;
procedure TMainForm.N11Click(Sender: TObject);
begin
mtab.cleartab;
mtab.openfromfile('piramid');
end;
procedure TMainForm.N800x600x161Click(Sender: TObject);
begin
// dxdraw.display.Mode:=;
// dxdraw.display.Mode.Height:=600;
end;
procedure TMainForm.N800x6001Click(Sender: TObject);
begin
dxdraw.display.width:=800;
dxdraw.display.Height:=600;
dxdraw.finalize;
dxdraw.initialize;
end;
procedure TMainForm.N640x4801Click(Sender: TObject);
begin
dxdraw.display.width:=640;
dxdraw.display.Height:=480;
dxdraw.finalize;
dxdraw.initialize;
end;
procedure TMainForm.N320x2401Click(Sender: TObject);
begin
dxdraw.display.width:=320;
dxdraw.display.Height:=240;
dxdraw.finalize;
dxdraw.initialize;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -