fFPSMovementD.pas 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. unit fFPSMovementD;
  2. interface
  3. uses
  4. Winapi.Windows,
  5. Winapi.OpenGL,
  6. System.SysUtils,
  7. System.Classes,
  8. Vcl.Graphics,
  9. Vcl.Controls,
  10. Vcl.Forms,
  11. Vcl.Dialogs,
  12. Vcl.Imaging.Jpeg,
  13. Vcl.ExtCtrls,
  14. Vcl.StdCtrls,
  15. GLS.Scene,
  16. GLS.Texture,
  17. GLS.Cadencer,
  18. GLS.FPSMovement,
  19. GLS.Keyboard,
  20. GLS.State,
  21. GLS.SceneViewer,
  22. GLS.Objects,
  23. GLS.Collision,
  24. GLS.VectorFileObjects,
  25. GLS.Navigator,
  26. GLS.VectorLists,
  27. GLS.Octree,
  28. GLS.File3DS,
  29. GLScene.VectorGeometry,
  30. GLS.GeomObjects,
  31. GLS.Material,
  32. GLS.Coordinates,
  33. GLS.SimpleNavigation,
  34. GLS.BaseClasses,
  35. GLScene.Utils;
  36. type
  37. TFormFPSMovement = class(TForm)
  38. GLScene1: TGLScene;
  39. GLSceneViewer1: TGLSceneViewer;
  40. GLCadencer1: TGLCadencer;
  41. FirstPersonCamera: TGLCamera;
  42. Map1: TGLFreeForm;
  43. GLMaterialLibrary1: TGLMaterialLibrary;
  44. GLLight: TGLLightSource;
  45. World: TGLDummyCube;
  46. ThirdPersonCamera: TGLCamera;
  47. PlayerSphere: TGLSphere;
  48. GLLightSource1: TGLLightSource;
  49. PlayerCentre: TGLSphere;
  50. Player: TGLDummyCube;
  51. Map2: TGLFreeForm;
  52. Bot: TGLDummyCube;
  53. BotCenter: TGLSphere;
  54. BotSphere: TGLSphere;
  55. Navigator1: TGLNavigator;
  56. MovManager: TGLFPSMovementManager;
  57. procedure FormCreate(Sender: TObject);
  58. procedure FormKeyDown(Sender: TObject; var Key: Word;
  59. Shift: TShiftState);
  60. procedure GLCadencer1Progress(Sender: TObject; const deltaTime,
  61. newTime: Double);
  62. private
  63. Path: TFileName;
  64. end;
  65. var
  66. FormFPSMovement: TFormFPSMovement;
  67. behav, behav2: TGLBFPSMovement;
  68. implementation
  69. var
  70. yangle: double = 90;
  71. xangle: double = 0;
  72. //Velocity:TGLVector=(0,0,0,0);
  73. //Gravity:TGLVector=(0,-9.81*20,0,0);
  74. Wireframe: Boolean;
  75. //DisplayTime:Integer=2000;
  76. {$R *.dfm}
  77. procedure TFormFPSMovement.FormCreate(Sender: TObject);
  78. begin
  79. Path := GetCurrentAssetPath();
  80. SetCurrentDir(Path + '\model');
  81. Map1.LoadFromFile('map.3ds');
  82. Map1.BuildOctree();
  83. Map1.Up.SetVector(0, 1, 0);
  84. Map2.LoadFromFile('beer.3ds');
  85. Map2.BuildOctree;
  86. ShowCursor(false);
  87. SetCursorPos(screen.width div 2, screen.Height div 2);
  88. behav := GetFPSMovement(player);
  89. behav2 := GetFPSMovement(bot);
  90. end;
  91. procedure TFormFPSMovement.FormKeyDown(Sender: TObject; var Key: Word;
  92. Shift: TShiftState);
  93. begin
  94. if Key = VK_ESCAPE then
  95. Halt;
  96. //show/hide arrows
  97. if key = VK_F1 then
  98. behav.ShowArrows := not behav.ShowArrows;
  99. //pause / unpause
  100. if Key = VK_PAUSE then
  101. GLCadencer1.Enabled := not GLCadencer1.Enabled;
  102. //first person
  103. if Key = VK_F2 then
  104. GLSceneViewer1.Camera := FirstPersonCamera;
  105. //third person
  106. if Key = VK_F3 then
  107. GLSceneViewer1.Camera := ThirdPersonCamera;
  108. // solid / wireframe
  109. if IsKeyDown(VK_F5) then
  110. begin
  111. WireFrame := not WireFrame;
  112. if WireFrame then
  113. begin
  114. Map1.UseMeshMaterials := false;
  115. Map1.Material.PolygonMode := pmLines;
  116. Map2.UseMeshMaterials := false;
  117. Map2.Material.PolygonMode := pmLines;
  118. end
  119. else
  120. begin
  121. Map1.UseMeshMaterials := true;
  122. Map1.Material.PolygonMode := pmFill;
  123. Map2.UseMeshMaterials := true;
  124. Map2.Material.PolygonMode := pmFill;
  125. end;
  126. end;
  127. end;
  128. procedure TFormFPSMovement.GLCadencer1Progress(Sender: TObject; const deltaTime,
  129. newTime: Double);
  130. var
  131. MovementScale: Single;
  132. begin
  133. MovementScale := Movmanager.MovementScale;
  134. //then update position according to keys being pressed
  135. if IsKeyDown('W') or IsKeyDown('Z') then
  136. behav.MoveForward(MovementScale * deltaTime);
  137. if IsKeyDown('S') then
  138. behav.MoveForward(-MovementScale * deltaTime);
  139. if IsKeyDown('A') or IsKeyDown('Q') then
  140. behav.StrafeHorizontal(-MovementScale * deltaTime);
  141. if IsKeyDown('D') then
  142. behav.StrafeHorizontal(MovementScale * deltaTime);
  143. //move up/down (for debugging)
  144. if IsKeyDown(VK_PRIOR) or IsKeyDown(VK_SPACE) then
  145. behav.StrafeVertical(MovementScale * deltaTime);
  146. if IsKeyDown(VK_NEXT) then
  147. behav.StrafeVertical(-MovementScale * deltaTime);
  148. //move bot
  149. if IsKeyDown('I') then
  150. behav2.MoveForward(MovementScale * deltaTime);
  151. if IsKeyDown('K') then
  152. behav2.MoveForward(-MovementScale * deltaTime);
  153. if IsKeyDown('J') then
  154. behav2.StrafeHorizontal(-MovementScale * deltaTime);
  155. if IsKeyDown('L') then
  156. behav2.StrafeHorizontal(MovementScale * deltaTime);
  157. if IsKeyDown('O') then
  158. behav2.StrafeVertical(MovementScale * deltaTime);
  159. if IsKeyDown('P') then
  160. behav.StrafeVertical(-MovementScale * deltaTime);
  161. if IsKeyDown(VK_LEFT) then
  162. behav.TurnHorizontal(-70 * deltatime);
  163. if IsKeyDown(VK_RIGHT) then
  164. behav.TurnHorizontal(70 * deltatime);
  165. if IsKeyDown(VK_UP) then
  166. behav.turnVertical(-70 * deltatime);
  167. if IsKeyDown(VK_DOWN) then
  168. behav.turnVertical(70 * deltatime);
  169. //update mouse view
  170. xangle := Mouse.CursorPos.X - Screen.Width / 2;
  171. yangle := Mouse.CursorPos.Y - Screen.Height / 2;
  172. SetCursorPos(Screen.width div 2, Screen.Height div 2);
  173. behav.TurnHorizontal(xangle * 40 * deltaTime);
  174. behav.TurnVertical(-yangle * 20 * deltaTime);
  175. GLSceneViewer1.Invalidate;
  176. end;
  177. end.