Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.11.2009, 23:36   #1
Uxas
Пользователь
 
Регистрация: 06.11.2009
Сообщений: 10
Печаль DelphiX. Странная ошибка - Stack Overflow

Прошу подсказать, изучаю DelphiX четвертый день, решил просто потренироваться - квадратом бегаю по экрану, в разных местах появляются еще почти такие же но другого класса, и хотел сделать так чтобы при столкновении происходило изменение координат у последних(вначале хотел сделать что то типа змейки) в общем всё как бы ничего и если пишу в столконовении Dead то они уничтожаются, но вот если пишу в DoMove главного квадрата сохранение координат в две переменные(x1:=x; y1:=y; ) а потом в DoMove квадратов которые появляются пишу x:=x1; y:=y1; в запущеной игре при столкновении вылазит ошибка "Stack Overflow" и игра закрывается немогу понять в чем дело. Может и это не будет походить на змейку и что то подобное ей а просто квадраты будут лепиться друг ко другу но меня интересует откуда берется эта ошибка и как от нее избавиться. Ну если кто то подскажет как написать змейку буду более благодарен

Последний раз редактировалось Uxas; 06.11.2009 в 23:38.
Uxas вне форума Ответить с цитированием
Старый 07.11.2009, 01:18   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Ничего странного. И DelphiX ни при чем - это не ее ошибка, а ваша.
Переполнение стека.
Где-то у вас, скорее всего, бесконечный цикл вызова процедуры или функции...
mihali4 вне форума Ответить с цитированием
Старый 07.11.2009, 05:02   #3
Uxas
Пользователь
 
Регистрация: 06.11.2009
Сообщений: 10
По умолчанию

Пусть я и чайник но узнать где что исправить или как вообще сделать лучше - хочется. Вот код не пугайтеь ))



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.
Uxas вне форума Ответить с цитированием
Старый 07.11.2009, 12:44   #4
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Да вот, навскидку (полностью код не анализировал, просто это сразу бросилось в глаза):
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
with TK2.Create(Dxspriteengine1.Engine) do
Вы по таймеру всю дорогу создаете какую-то хреновину. А где вы созданные экземпляры уничтожаете?
Вот они и копятся у вас в памяти...
mihali4 вне форума Ответить с цитированием
Старый 07.11.2009, 13:56   #5
VintProg
not
Участник клуба
 
Аватар для VintProg
 
Регистрация: 27.06.2009
Сообщений: 1,399
По умолчанию

Uxas
Не забывайте выгружать объекты из памяти.
VintProg вне форума Ответить с цитированием
Старый 07.11.2009, 22:28   #6
Uxas
Пользователь
 
Регистрация: 06.11.2009
Сообщений: 10
По умолчанию

так где что исправить? Я в общем не специалист и сообщение выгружать объекты из памяти мне мало о чем говорит(( Сейчас делаю игру по мануалу вылазит то же самое после нескольких секунд игры хотя сначала все нормально работает... Попробую еще пока что нибудь исправить, если не получится приведу код.
Uxas вне форума Ответить с цитированием
Старый 07.11.2009, 22:43   #7
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Код:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
with TK2.Create(Dxspriteengine1.Engine) do
begin
...
end;
TK2.Free;
end;
mihali4 вне форума Ответить с цитированием
Старый 08.06.2010, 14:24   #8
Poiree
Новичок
Джуниор
 
Регистрация: 24.08.2009
Сообщений: 1
По умолчанию по ДелфиИкс

Здравствуйте, подскажите, как исправить ошибку?
Я создал в игре 5 кнопок и хочу сделать коллизию и проверку, если на какую-либо кнопку кликнули, то она свое свойство transparent поменяет на false. Но у меня одни переполнения стека идут и вылет из проги. Дело не в том, что я постоянно создаю какой-нибудь класс или типа того, как было указано в тексте выше, у меня происходит это именно из-за коллизий, когда я их вообще убираю, все норм... что сделать?Смотрю примеры, все, что нужно, так же делаю, а у меня все равно зависает...
P.S. Да и вообще я читал, что процедура ду коллижн глюченная очень, легче по координатам перебирать каждый созданный объект и смотреть, на него кликнули или нет... Аля 90-ые гг.))

Последний раз редактировалось Poiree; 08.06.2010 в 14:55.
Poiree вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переполнение стека (Stack overflow) zotox Помощь студентам 4 13.09.2009 03:16
Stack Overflow Neeter БД в Delphi 2 03.06.2009 00:39
Stack OverFlow Tanya2008 Общие вопросы Delphi 6 11.05.2009 15:16
При переключении между чекбоксами - ошибка Stack overflow. Как исправить эту ошибку? SkAndrew Общие вопросы Delphi 5 26.08.2008 21:32
Stack Overflow??? Рустам Общие вопросы Delphi 7 01.04.2008 17:24