123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 |
- unit fFPSMovement;
- interface
- uses
- Winapi.Windows,
- Winapi.OpenGL,
- System.SysUtils,
- System.Classes,
- Vcl.Graphics,
- Vcl.Controls,
- Vcl.Forms,
- Vcl.Dialogs,
- Vcl.Imaging.Jpeg,
- Vcl.ExtCtrls,
- Vcl.StdCtrls,
- GLS.Scene,
- GLS.Texture,
- GLS.Cadencer,
- GLS.FPSMovement,
- GLS.Keyboard,
- GLS.State,
- GLS.SceneViewer,
- GLS.Objects,
- GLS.Collision,
- GLS.VectorFileObjects,
- GLS.Navigator,
- GLS.VectorLists,
- GLS.Octree,
- GLS.File3DS,
- GLS.VectorGeometry,
- GLS.GeomObjects,
- GLS.Material,
- GLS.Coordinates,
- GLS.SimpleNavigation,
- GLS.BaseClasses,
- GLS.Utils;
- type
- TFormFPSMovement = class(TForm)
- GLScene1: TGLScene;
- GLSceneViewer1: TGLSceneViewer;
- GLCadencer1: TGLCadencer;
- FirstPersonCamera: TGLCamera;
- Map1: TGLFreeForm;
- GLMaterialLibrary1: TGLMaterialLibrary;
- GLLight: TGLLightSource;
- World: TGLDummyCube;
- ThirdPersonCamera: TGLCamera;
- PlayerSphere: TGLSphere;
- GLLightSource1: TGLLightSource;
- PlayerCentre: TGLSphere;
- Player: TGLDummyCube;
- Map2: TGLFreeForm;
- Bot: TGLDummyCube;
- BotCenter: TGLSphere;
- BotSphere: TGLSphere;
- Navigator1: TGLNavigator;
- MovManager: TGLFPSMovementManager;
- GLSimpleNavigation1: TGLSimpleNavigation;
- procedure FormCreate(Sender: TObject);
- procedure FormKeyDown(Sender: TObject; var Key: Word;
- Shift: TShiftState);
- procedure GLCadencer1Progress(Sender: TObject; const deltaTime,
- newTime: Double);
- private
- end;
- var
- FormFPSMovement: TFormFPSMovement;
- behav, behav2: TGLBFPSMovement;
- implementation
- var
- yangle: double = 90;
- xangle: double = 0;
- //Velocity:TGLVector=(0,0,0,0);
- //Gravity:TGLVector=(0,-9.81*20,0,0);
- Wireframe: Boolean;
- //DisplayTime:Integer=2000;
- {$R *.dfm}
- procedure TFormFPSMovement.FormCreate(Sender: TObject);
- begin
- SetGLSceneMediaDir;
- Map1.LoadFromFile('map.3ds');
- Map1.BuildOctree();
- Map1.Up.SetVector(0, 1, 0);
- Map2.LoadFromFile('beer.3ds');
- Map2.BuildOctree;
- ShowCursor(false);
- SetCursorPos(screen.width div 2, screen.Height div 2);
- behav := GetFPSMovement(player);
- behav2 := GetFPSMovement(bot);
- end;
- procedure TFormFPSMovement.FormKeyDown(Sender: TObject; var Key: Word;
- Shift: TShiftState);
- begin
- if Key = VK_ESCAPE then
- Halt;
- //show/hide arrows
- if key = VK_F1 then
- behav.ShowArrows := not behav.ShowArrows;
- //pause / unpause
- if Key = VK_PAUSE then
- GLCadencer1.Enabled := not GLCadencer1.Enabled;
- //first person
- if Key = VK_F2 then
- GLSceneViewer1.Camera := FirstPersonCamera;
- //third person
- if Key = VK_F3 then
- GLSceneViewer1.Camera := ThirdPersonCamera;
- // solid / wireframe
- if iskeydown(VK_F5) then
- begin
- WireFrame := not WireFrame;
- if WireFrame then
- begin
- Map1.UseMeshMaterials := false;
- Map1.Material.PolygonMode := pmLines;
- map2.UseMeshMaterials := false;
- Map2.Material.PolygonMode := pmLines;
- end
- else
- begin
- Map1.UseMeshMaterials := true;
- Map1.Material.PolygonMode := pmFill;
- Map2.UseMeshMaterials := true;
- Map2.Material.PolygonMode := pmFill;
- end;
- end;
- end;
- procedure TFormFPSMovement.GLCadencer1Progress(Sender: TObject; const deltaTime,
- newTime: Double);
- var
- MovementScale: Single;
- begin
- MovementScale := Movmanager.MovementScale;
- //then update position according to keys being pressed
- if IsKeyDown('W') or IsKeyDown('Z') then
- behav.MoveForward(MovementScale * deltaTime);
- if IsKeyDown('S') then
- behav.MoveForward(-MovementScale * deltaTime);
- if IsKeyDown('A') or IsKeyDown('Q') then
- behav.StrafeHorizontal(-MovementScale * deltaTime);
- if IsKeyDown('D') then
- behav.StrafeHorizontal(MovementScale * deltaTime);
- //move up/down (for debugging)
- if IsKeyDown(VK_PRIOR) or IsKeyDown(VK_SPACE) then
- behav.StrafeVertical(MovementScale * deltaTime);
- if IsKeyDown(VK_NEXT) then
- behav.StrafeVertical(-MovementScale * deltaTime);
- //move bot
- if IsKeyDown('I') then
- behav2.MoveForward(MovementScale * deltaTime);
- if IsKeyDown('K') then
- behav2.MoveForward(-MovementScale * deltaTime);
- if IsKeyDown('J') then
- behav2.StrafeHorizontal(-MovementScale * deltaTime);
- if IsKeyDown('L') then
- behav2.StrafeHorizontal(MovementScale * deltaTime);
- if IsKeyDown('O') then
- behav2.StrafeVertical(MovementScale * deltaTime);
- if IsKeyDown('P') then
- behav.StrafeVertical(-MovementScale * deltaTime);
- if IsKeyDown(VK_LEFT) then
- behav.TurnHorizontal(-70 * deltatime);
- if IsKeyDown(VK_RIGHT) then
- behav.TurnHorizontal(70 * deltatime);
- if IsKeyDown(VK_UP) then
- behav.turnVertical(-70 * deltatime);
- if IsKeyDown(VK_DOWN) then
- behav.turnVertical(70 * deltatime);
- //update mouse view
- xangle := mouse.CursorPos.X - screen.Width / 2;
- yangle := mouse.CursorPos.Y - screen.Height / 2;
- setcursorpos(screen.width div 2, screen.Height div 2);
- behav.TurnHorizontal(xangle * 40 * deltaTime);
- behav.TurnVertical(-yangle * 20 * deltaTime);
- GLSceneViewer1.Invalidate;
- end;
- end.
|