Движок используемый мной при написании курсовой работы. По моему очень удобный и просто написанный.
unit MainUnit; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, GLU, GLUtils, OpenGL, Math, ExtCtrls, StdCtrls; const CR = 50; mmWalk = 1; mmNoclip = 2; type TForm1 = class(TForm) Timer1: TTimer; procedure FormCreate(Sender: TObject); procedure FormPaint(Sender: TObject); procedure FormResize(Sender: TObject); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure Timer1Timer(Sender: TObject); procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); private { Private declarations } public { Public declarations } end; TPV = record X,Y,Z,VR,HR: Single; end; procedure DrawGreed; var Move: array [1..4] of Byte; UserP: TPV; Form1: TForm1; Mode: Integer; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var I: Integer; begin InitOpenGL(Handle); ClientHeight:=Round(ClientWidth*0.75); glEnable(GL_DEPTH_TEST); glMatrixMode(GL_PROJECTION); glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); gluPerspective(45.0,ClientWidth/ClientHeight,0.1,100); glClearColor(0,0,0,0); ShowCursor(False); With UserP do begin X:=0; Y:=-1; Z:=0; VR:=0; HR:=0; end; glNewList(1,GL_COMPILE); glBegin(GL_LINES); For I:=-CR to CR do begin glColor((Random(10)/10)+0.1,(Random(10)/10)+0.1,(Random(10)/10)+0.1); glVertex3f(I,0,CR); glVerTex3f(I,0,-CR); glVertex3f(-CR,0,I); glVertex3f(CR,0,I); end; glEnd; glEndList; end; procedure TForm1.FormPaint(Sender: TObject); begin DrawGreed; end; procedure TForm1.FormResize(Sender: TObject); begin DrawGreed; end; procedure DrawGreed; begin glViewPort(0,0,Form1.ClientWidth,Form1.ClientHeight); glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); glColor3f(1.0,1.0,1.0); glPushMatrix; With UserP do begin glRotate(HR,Abs(VR),0,0); glRotate(VR,0,1,0); glTranslate(X,Y,Z); end; glCallList(1); glTranslate(0,10,0); glCallList(1); glPopMatrix; SwapGLBuffers; end; procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin Case Key of 27:Form1.Close; Ord('W'):Move[1]:=1; Ord('A'):Move[2]:=1; Ord('S'):Move[3]:=1; Ord('D'):Move[4]:=1; end; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin CloseOpenGL(Handle); end; procedure TForm1.Timer1Timer(Sender: TObject); const SPEEDWS=0.1; SPEEDAD=0.05; var PR: TPoint; begin GetCursorPos(PR); With UserP do With PR do begin VR:=VR+(X-Round(Left+ClientWidth/2))*0.1; If (VR>=360) then VR := 0; If (VR<=-360) then VR := 0; HR:=HR+(Y-Round(Top+ClientHeight/2))*0.1; If (HR>=90) then HR:=90; If (HR<=-90) then HR:=-90; SetCursorPos(Round(Left+ClientWidth/2),Round(Top+ClientHeight/2)); end; With UserP do begin If (Move[1]=1) then begin Z:=Z+Cos(DegToRad(VR))*SPEEDWS; X:=X-Sin(DegToRad(VR))*SPEEDWS; //Y:=Y+Sin(DegToRad(HR))*SPEEDWS //если раскомментировать будет режим noclip end; If (Move[2]=1) then begin Z:=Z+Sin(DegToRad(VR))*SPEEDAD; X:=X+Cos(DegToRad(VR))*SPEEDAD; end; If (Move[3]=1) then begin Z:=Z-Cos(DegToRad(VR))*SPEEDWS; X:=X+Sin(DegToRad(VR))*SPEEDWS; //Y:=Y-Sin(DegToRad(HR))*SPEEDWS //если раскомментировать будет режим noclip end; If (Move[4]=1) then begin Z:=Z-Sin(DegToRad(VR))*SPEEDAD; X:=X-Cos(DegToRad(VR))*SPEEDAD; end; end; DrawGreed; end; procedure TForm1.FormKeyUp(Sender: TObject; var KeyWord; Shift: TShiftState); begin Case Key of Ord('W'):Move[1]:=0; Ord('A'):Move[2]:=0; Ord('S'):Move[3]:=0; Ord('D'):Move[4]:=0; end; end; end.
Комментариев нет:
Отправить комментарий