Форум по 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;
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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