
17.12.2009, 03:41
|
 |
Прохожий
|
|
Регистрация: 17.12.2009
Сообщения: 28
Репутация: 10
|
|
Движок самописный. Ошибка. Нид хелп!
Я написал примитивный 3Д движок(незнаю как это ещё назвать). Вот код юнита:
Код:
unit Engine;
interface
uses EngineDraw,Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, ComCtrls;
const ConstRad=57.295779513082320876798154814105; //1 радиан = ConstRad
type
ZoomRange = 1..20;
MyCamera = class
hAngle:integer;
vAngle:integer;
Zoom:ZoomRange;
procedure TL;
procedure TR;
Procedure TUP;
Procedure TD;
{FOV:???}
end;
MyDisplay = class
handle:HWND;
Canvas:TCanvas;
Camera:MyCamera;
public
procedure AssignTo(wnd:TWinControl);
end;
coords = class
x:integer;
y:integer;
z:integer;
p:integer;
t:integer;
public
procedure Draw(display:MyDisplay);
procedure SetDefault;
end;
line = class
stp:coords;
enp:coords;
public
procedure Draw(display:MyDisplay);
procedure SetDefault;
end;
obj = class
name:integer;
dot:coords;
lin:line;
end;
WorldObjects = class
list:array of Obj;
count:integer;
procedure AddDot(x,y,z:integer);
procedure AddLine(stp,enp:coords);
end;
implementation
function ATR(Angle:integer):real;//Перевод из градусов в радианы.Стандартную
begin //функцию не нашёл. Надо писать свою.
ATR:=(Angle/ConstRad);
end;
{function ITF(input:integer):real;
begin
ITF:=strtofloat(IntToStr(input));
end;
}
procedure MyDisplay.AssignTo(wnd:TWinControl);//На что мы будем выводить изобр.
var buffer:MyDisplay;
begin
buffer:=MyDisplay.Create;
buffer.Canvas:=TCanvas.create;
buffer.Canvas.Handle:=GetDC(wnd.Handle);
self:=buffer;
self.Camera:=(Self.Camera);
Buffer.Canvas.Destroy;
end;
procedure MyCamera.TL;
begin
if hAngle=0 then hAngle:=359 else dec(hAngle);
end;
procedure MyCamera.TR;
begin
if hAngle=359 then hAngle:=0 else inc(hAngle);
end;
procedure MyCamera.TUP;
begin
if vAngle=0 then vAngle:=359 else dec(vAngle);
end;
procedure MyCamera.TD;
begin
if vAngle=359 then vAngle:=0 else inc(vAngle);
end;
procedure coords.SetDefault; //Обнуление параметров
begin
x:=0;
y:=0;
z:=0;
p:=0;
t:=0;
end;
procedure line.SetDefault; //Обнуление
begin
with stp do
begin
x:=0;
y:=0;
z:=0;
p:=0;
t:=0;
end;
with enp do
begin
x:=0;
y:=0;
z:=0;
p:=0;
t:=0;
end;
end;
Procedure CalculateDotPos(Dot:coords;Display:MyDisplay);
begin
//Координата p(горизонталь) плоскости экрана
dot.p:=round(cos(ATR(Display.Camera.hangle))*dot.x+Sin(ATR(Display.Camera.hangle))*dot.y);
//Координата t(вертикаль) плоскости экрана
dot.t:=0;
end;
Procedure CalculateLinePos(Line:line;display:MyDisplay);
begin
CalculateDotPos(Line.stp,display); //Вычисление координат начала линии
CalculateDotPos(Line.enp,display); //Вычисление координат конца линии
end;
Procedure CalculateObjPos(s:obj;Display:MyDisplay);
begin
case s.name of
1:CalculateDotPos(s.dot,Display); //Вычисление позиции точки на экране
2:CalculateLinePos(s.lin,Display); //Вычисление позиции линии на экране
end;
end;
Procedure coords.Draw(Display:MyDisplay);
begin
Display.Canvas.Pixels[self.p,self.t];
end;
Procedure line.Draw(Display:MyDisplay);
begin
Display.Canvas.MoveTo(self.stp.p,self.stp.t);
Display.Canvas.LineTo(enp.p,enp.t);
end;
procedure WorldObjects.AddDot(x,y,z:integer);
begin
list[count+1].name:=1;
list[count+1].dot.x:=x;
list[count+1].dot.y:=y;
list[count+1].dot.z:=z;
inc(count);
end;
procedure WorldObjects.AddLine(stp,enp:coords);
var buf:WorldObjects;
begin
list[count+1].name:=2;
list[count+1].lin.stp:=stp;
list[count+1].lin.enp:=enp;
inc(count);
end;
end.
Код Формы:
Код:
var
Form1: TForm1;
Display:MyDisplay;
World:WorldObjects;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
Display:=MyDisplay.Create;
Display.AssignTo(Panel1);
World:=WorldObjects.Create;
World.count:=0;
end;
procedure TForm1.Button1Click(Sender: TObject);
var bufstp,bufenp:coords;
begin
bufstp:=coords.Create;
bufenp:=coords.Create;
Bufstp.x:=strtoint(edit1.Text);
Bufstp.y:=strtoint(edit2.Text);
Bufstp.z:=strtoint(edit3.Text);
Bufenp.x:=strtoint(edit4.Text);
Bufenp.y:=strtoint(edit5.Text);
Bufenp.z:=strtoint(edit6.Text);
World.AddLine(bufstp,bufenp);
end;
В основной форме есть Panel1, на которую выводится изображение. Координаты линии вводятся через Edit'ы. Когда нажимаю button1 координаты передаются в процедуру World.Addline и там должны строиться координаты относительно плоскости экрана(тоесть моей панельки). Но выбивает ошибку типа access violation на строке, которую я выделил. Прошу помочь разобраться в чём дело. Спасибо!
|