![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Прошу подсказать, изучаю DelphiX четвертый день, решил просто потренироваться - квадратом бегаю по экрану, в разных местах появляются еще почти такие же но другого класса, и хотел сделать так чтобы при столкновении происходило изменение координат у последних(вначале хотел сделать что то типа змейки) в общем всё как бы ничего и если пишу в столконовении Dead то они уничтожаются, но вот если пишу в DoMove главного квадрата сохранение координат в две переменные(x1:=x; y1:=y; ) а потом в DoMove квадратов которые появляются пишу x:=x1; y:=y1; в запущеной игре при столкновении вылазит ошибка "Stack Overflow" и игра закрывается немогу понять в чем дело. Может и это не будет походить на змейку и что то подобное ей а просто квадраты будут лепиться друг ко другу но меня интересует откуда берется эта ошибка и как от нее избавиться. Ну если кто то подскажет как написать змейку буду более благодарен
|
|
#2
|
||||
|
||||
|
Ищи ошибку где то в алгоритме... "Stack Overflow" означает переполнение стека...т.е. где то засоряется память, неосбобождается какая то больша структура или что то подобное...на первый взгляд не скажешь...попробуй поставить break где то перед возникновением ошибки...
|
|
#3
|
|||
|
|||
|
Пусть я и чайник но узнать где что исправить или как вообще сделать лучше - хочется. Вот код не пугайтеь ))
Код:
var
Form1: TForm1;
x1,y1: double;
k: integer;
implementation
{$R *.dfm}
type
TK1 = class(TimageSprite)
protected
procedure DoMove(MoveCount: Integer); override;
public
end;
TK2 = class(TimageSprite)
protected
Procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
Procedure DoMove(MoveCount: Integer); override;
public
end;
Procedure TK1.DoMove(MoveCount: Integer);
begin
inherited DoMove(MoveCount);
if isLeft in Form1.DXInput1.States then begin k:=1; end;
if isRight in Form1.DXInput1.States then begin k:=4; end;
if isUp in Form1.DXInput1.States then begin k:=2; end;
if isDown in Form1.DXInput1.States then begin k:=3; end;
if k=4 then x:=x+5;
if k=1 then x:=x-5;
if k=2 then y:=y-5;
if k=3 then y:=y+5;
if y>=form1.DXDraw1.SurfaceHeight-image.Height then
y:=form1.DXDraw1.SurfaceHeight-image.Height;
if x >= form1.DXDraw1.SurfaceWidth -image.Width then
x:=form1.DXDraw1.SurfaceWidth -image.Width;
if y<=0 then
y:=1;
if x<=0 then
x:=1;
end;
Procedure tk2.DoCollision(Sprite: TSprite; var Done: Boolean);
begin
if Sprite is Tk1 then k:=5;
Collision;
end;
Procedure TK2.DoMove(MoveCount: Integer);
begin
inherited DoMove(MoveCount);
if k=5 then
begin
x:=x1;
y:=y1;
end;
Collision;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Dxdraw1.Cursor:=crNone;
with TK1.Create(Dxspriteengine1.Engine) do
begin
PixelCheck := True;
Image := form1.dxImageList1.Items.Find('k1');
x:=0;
y:=0;
Width := Image.Width;
Height := Image.Height;
AnimCount := Image.PatternCount;
AnimLooped := True;
AnimSpeed := 10 / 500;
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
with TK2.Create(Dxspriteengine1.Engine) do
begin
PixelCheck := True;
Image := form1.dxImageList1.Items.Find('k2');
x:=random(1024-50);
y:=random(768-50);
x1:=x;
y1:=y;
Width := Image.Width;
Height := Image.Height;
AnimCount := Image.PatternCount;
AnimLooped := True;
AnimSpeed := 10 / 500;
end;
end;
procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer);
begin
if not DXDraw1.CanDraw then exit;
DXInput1.Update;
DXSpriteEngine1.Move(LagCount);
DXSpriteEngine1.Dead;
DXDraw1.Surface.Fill(0);
DXSpriteEngine1.Draw;
DXDraw1.Flip;
end;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key=VK_ESCAPE then application.Terminate;
end;
end.Последний раз редактировалось Admin, 07.11.2009 в 11:05. |
|
#4
|
||||
|
||||
|
как я уже говорил DelphiX сама по себе очень текучая, утечка 50% может быть в самих исходниках DelphiX
|
|
#5
|
|||
|
|||
|
А делфи не умеет задавать размер стека? Программируя на ассемблере у меня была такая проблема, я размер стека увеличил, и все решилось.
|
|
#6
|
||||
|
||||
|
Цитата:
|
|
#7
|
|||
|
|||
|
так в чем ошибка у меня в коде? где что исправить я так и не пойм? (((
кстати сейчас делаю игру по мануалу вылазит то же самое после нескольких секунд игры хотя сначала все нормально работает... Попробую еще пока что нибудь сделать, если не получится приведу код. |