⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.pas

📁 3d台球源码
💻 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 + -