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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 07.11.2009, 00:40
Uxas Uxas вне форума
Прохожий
 
Регистрация: 06.11.2009
Сообщения: 3
Репутация: 10
Печаль DelphiX. Странная ошибка - Stack Overflow

Прошу подсказать, изучаю DelphiX четвертый день, решил просто потренироваться - квадратом бегаю по экрану, в разных местах появляются еще почти такие же но другого класса, и хотел сделать так чтобы при столкновении происходило изменение координат у последних(вначале хотел сделать что то типа змейки) в общем всё как бы ничего и если пишу в столконовении Dead то они уничтожаются, но вот если пишу в DoMove главного квадрата сохранение координат в две переменные(x1:=x; y1:=y; ) а потом в DoMove квадратов которые появляются пишу x:=x1; y:=y1; в запущеной игре при столкновении вылазит ошибка "Stack Overflow" и игра закрывается немогу понять в чем дело. Может и это не будет походить на змейку и что то подобное ей а просто квадраты будут лепиться друг ко другу но меня интересует откуда берется эта ошибка и как от нее избавиться. Ну если кто то подскажет как написать змейку буду более благодарен
Ответить с цитированием
  #2  
Старый 07.11.2009, 02:06
Аватар для NIch
NIch NIch вне форума
Продвинутый
 
Регистрация: 02.06.2008
Адрес: Бендеры ПМР
Сообщения: 754
Репутация: 2446
По умолчанию

Ищи ошибку где то в алгоритме... "Stack Overflow" означает переполнение стека...т.е. где то засоряется память, неосбобождается какая то больша структура или что то подобное...на первый взгляд не скажешь...попробуй поставить break где то перед возникновением ошибки...
__________________
В начале был Бит, потом Байт и только потом появилось Слово...
Ответить с цитированием
  #3  
Старый 07.11.2009, 05:15
Uxas Uxas вне форума
Прохожий
 
Регистрация: 06.11.2009
Сообщения: 3
Репутация: 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.
Admin: Пользуемся тегами!

Последний раз редактировалось Admin, 07.11.2009 в 11:05.
Ответить с цитированием
  #4  
Старый 07.11.2009, 07:33
Аватар для AleD
AleD AleD вне форума
Активный
 
Регистрация: 21.02.2009
Адрес: г.Краснокаменск
Сообщения: 383
Репутация: 91
По умолчанию

как я уже говорил DelphiX сама по себе очень текучая, утечка 50% может быть в самих исходниках DelphiX
__________________
TAleD = class(TUser)
public
function HelpMe(ASubject, ARequest: String): String;
function GiveMeExample(ASubject: String): TStringList;
procedure WriteReview(APost: Integer; ADescription: TStringList);
end;
Ответить с цитированием
  #5  
Старый 07.11.2009, 08:06
Roman2807 Roman2807 вне форума
Прохожий
 
Регистрация: 29.10.2009
Сообщения: 14
Репутация: 10
По умолчанию

А делфи не умеет задавать размер стека? Программируя на ассемблере у меня была такая проблема, я размер стека увеличил, и все решилось.
Ответить с цитированием
  #6  
Старый 07.11.2009, 08:08
Аватар для AleD
AleD AleD вне форума
Активный
 
Регистрация: 21.02.2009
Адрес: г.Краснокаменск
Сообщения: 383
Репутация: 91
По умолчанию

Цитата:
Сообщение от Roman2807
А делфи не умеет задавать размер стека? Программируя на ассемблере у меня была такая проблема, я размер стека увеличил, и все решилось.
Делфи сама манипулирует с памятью, стек она выбирает автоматом, но есть пределы
__________________
TAleD = class(TUser)
public
function HelpMe(ASubject, ARequest: String): String;
function GiveMeExample(ASubject: String): TStringList;
procedure WriteReview(APost: Integer; ADescription: TStringList);
end;
Ответить с цитированием
  #7  
Старый 07.11.2009, 22:22
Uxas Uxas вне форума
Прохожий
 
Регистрация: 06.11.2009
Сообщения: 3
Репутация: 10
По умолчанию

так в чем ошибка у меня в коде? где что исправить я так и не пойм? (((
кстати сейчас делаю игру по мануалу вылазит то же самое после нескольких секунд игры хотя сначала все нормально работает... Попробую еще пока что нибудь сделать, если не получится приведу код.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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