Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 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 на строке, которую я выделил. Прошу помочь разобраться в чём дело. Спасибо!
Ответить с цитированием
 


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 18:46.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025