вторник, 23 августа 2011 г.

Движок.

Движок используемый мной при написании курсовой работы. По моему очень удобный и просто написанный.




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.


Комментариев нет:

Отправить комментарий