fFPSMovementD.pas 5.0 KB

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