![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 06.11.2009
Сообщений: 10
|
![]()
Прошу подсказать, изучаю DelphiX четвертый день, решил просто потренироваться - квадратом бегаю по экрану, в разных местах появляются еще почти такие же но другого класса, и хотел сделать так чтобы при столкновении происходило изменение координат у последних(вначале хотел сделать что то типа змейки) в общем всё как бы ничего и если пишу в столконовении Dead то они уничтожаются, но вот если пишу в DoMove главного квадрата сохранение координат в две переменные(x1:=x; y1:=y; ) а потом в DoMove квадратов которые появляются пишу x:=x1; y:=y1; в запущеной игре при столкновении вылазит ошибка "Stack Overflow" и игра закрывается немогу понять в чем дело. Может и это не будет походить на змейку и что то подобное ей а просто квадраты будут лепиться друг ко другу но меня интересует откуда берется эта ошибка и как от нее избавиться. Ну если кто то подскажет как написать змейку буду более благодарен
![]() Последний раз редактировалось Uxas; 06.11.2009 в 23:38. |
![]() |
![]() |
![]() |
#2 |
*
Старожил
Регистрация: 22.11.2006
Сообщений: 9,201
|
![]()
Ничего странного. И DelphiX ни при чем - это не ее ошибка, а ваша.
Переполнение стека. Где-то у вас, скорее всего, бесконечный цикл вызова процедуры или функции... |
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 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. |
![]() |
![]() |
![]() |
#4 |
*
Старожил
Регистрация: 22.11.2006
Сообщений: 9,201
|
![]()
Да вот, навскидку (полностью код не анализировал, просто это сразу бросилось в глаза):
Код:
Вот они и копятся у вас в памяти... |
![]() |
![]() |
![]() |
#6 |
Пользователь
Регистрация: 06.11.2009
Сообщений: 10
|
![]()
так где что исправить? Я в общем не специалист и сообщение выгружать объекты из памяти мне мало о чем говорит(( Сейчас делаю игру по мануалу вылазит то же самое после нескольких секунд игры хотя сначала все нормально работает... Попробую еще пока что нибудь исправить, если не получится приведу код.
|
![]() |
![]() |
![]() |
#7 |
*
Старожил
Регистрация: 22.11.2006
Сообщений: 9,201
|
![]() Код:
|
![]() |
![]() |
![]() |
#8 |
Новичок
Джуниор
Регистрация: 24.08.2009
Сообщений: 1
|
![]()
Здравствуйте, подскажите, как исправить ошибку?
Я создал в игре 5 кнопок и хочу сделать коллизию и проверку, если на какую-либо кнопку кликнули, то она свое свойство transparent поменяет на false. Но у меня одни переполнения стека идут и вылет из проги. Дело не в том, что я постоянно создаю какой-нибудь класс или типа того, как было указано в тексте выше, у меня происходит это именно из-за коллизий, когда я их вообще убираю, все норм... что сделать?Смотрю примеры, все, что нужно, так же делаю, а у меня все равно зависает... P.S. Да и вообще я читал, что процедура ду коллижн глюченная очень, легче по координатам перебирать каждый созданный объект и смотреть, на него кликнули или нет... Аля 90-ые гг.)) Последний раз редактировалось Poiree; 08.06.2010 в 14:55. |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Переполнение стека (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 |