Движок используемый мной при написании курсовой работы. По моему очень удобный и просто написанный.
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.
Комментариев нет:
Отправить комментарий