fFPSMovement.pas 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. unit fFPSMovement;
  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. GLS.VectorGeometry,
  30. GLS.GeomObjects,
  31. GLS.Material,
  32. GLS.Coordinates,
  33. GLS.SimpleNavigation,
  34. GLS.BaseClasses,
  35. GLS.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. GLSimpleNavigation1: TGLSimpleNavigation;
  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. 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. SetGLSceneMediaDir;
  80. Map1.LoadFromFile('map.3ds');
  81. Map1.BuildOctree();
  82. Map1.Up.SetVector(0, 1, 0);
  83. Map2.LoadFromFile('beer.3ds');
  84. Map2.BuildOctree;
  85. ShowCursor(false);
  86. SetCursorPos(screen.width div 2, screen.Height div 2);
  87. behav := GetFPSMovement(player);
  88. behav2 := GetFPSMovement(bot);
  89. end;
  90. procedure TFormFPSMovement.FormKeyDown(Sender: TObject; var Key: Word;
  91. Shift: TShiftState);
  92. begin
  93. if Key = VK_ESCAPE then
  94. Halt;
  95. //show/hide arrows
  96. if key = VK_F1 then
  97. behav.ShowArrows := not behav.ShowArrows;
  98. //pause / unpause
  99. if Key = VK_PAUSE then
  100. GLCadencer1.Enabled := not GLCadencer1.Enabled;
  101. //first person
  102. if Key = VK_F2 then
  103. GLSceneViewer1.Camera := FirstPersonCamera;
  104. //third person
  105. if Key = VK_F3 then
  106. GLSceneViewer1.Camera := ThirdPersonCamera;
  107. // solid / wireframe
  108. if iskeydown(VK_F5) then
  109. begin
  110. WireFrame := not WireFrame;
  111. if WireFrame then
  112. begin
  113. Map1.UseMeshMaterials := false;
  114. Map1.Material.PolygonMode := pmLines;
  115. map2.UseMeshMaterials := false;
  116. Map2.Material.PolygonMode := pmLines;
  117. end
  118. else
  119. begin
  120. Map1.UseMeshMaterials := true;
  121. Map1.Material.PolygonMode := pmFill;
  122. Map2.UseMeshMaterials := true;
  123. Map2.Material.PolygonMode := pmFill;
  124. end;
  125. end;
  126. end;
  127. procedure TFormFPSMovement.GLCadencer1Progress(Sender: TObject; const deltaTime,
  128. newTime: Double);
  129. var
  130. MovementScale: Single;
  131. begin
  132. MovementScale := Movmanager.MovementScale;
  133. //then update position according to keys being pressed
  134. if IsKeyDown('W') or IsKeyDown('Z') then
  135. behav.MoveForward(MovementScale * deltaTime);
  136. if IsKeyDown('S') then
  137. behav.MoveForward(-MovementScale * deltaTime);
  138. if IsKeyDown('A') or IsKeyDown('Q') then
  139. behav.StrafeHorizontal(-MovementScale * deltaTime);
  140. if IsKeyDown('D') then
  141. behav.StrafeHorizontal(MovementScale * deltaTime);
  142. //move up/down (for debugging)
  143. if IsKeyDown(VK_PRIOR) or IsKeyDown(VK_SPACE) then
  144. behav.StrafeVertical(MovementScale * deltaTime);
  145. if IsKeyDown(VK_NEXT) then
  146. behav.StrafeVertical(-MovementScale * deltaTime);
  147. //move bot
  148. if IsKeyDown('I') then
  149. behav2.MoveForward(MovementScale * deltaTime);
  150. if IsKeyDown('K') then
  151. behav2.MoveForward(-MovementScale * deltaTime);
  152. if IsKeyDown('J') then
  153. behav2.StrafeHorizontal(-MovementScale * deltaTime);
  154. if IsKeyDown('L') then
  155. behav2.StrafeHorizontal(MovementScale * deltaTime);
  156. if IsKeyDown('O') then
  157. behav2.StrafeVertical(MovementScale * deltaTime);
  158. if IsKeyDown('P') then
  159. behav.StrafeVertical(-MovementScale * deltaTime);
  160. if IsKeyDown(VK_LEFT) then
  161. behav.TurnHorizontal(-70 * deltatime);
  162. if IsKeyDown(VK_RIGHT) then
  163. behav.TurnHorizontal(70 * deltatime);
  164. if IsKeyDown(VK_UP) then
  165. behav.turnVertical(-70 * deltatime);
  166. if IsKeyDown(VK_DOWN) then
  167. behav.turnVertical(70 * deltatime);
  168. //update mouse view
  169. xangle := mouse.CursorPos.X - screen.Width / 2;
  170. yangle := mouse.CursorPos.Y - screen.Height / 2;
  171. setcursorpos(screen.width div 2, screen.Height div 2);
  172. behav.TurnHorizontal(xangle * 40 * deltaTime);
  173. behav.TurnVertical(-yangle * 20 * deltaTime);
  174. GLSceneViewer1.Invalidate;
  175. end;
  176. end.