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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.08.2009, 10:24   #1
NoHeart
Пользователь
 
Регистрация: 15.01.2009
Сообщений: 52
По умолчанию Переполнение стека

Собственно вопрос, почему при пересечении обекта TBonus объектом Tplayer возникает переполнение стека? Перепробовал все возможные варианты в процедуре DoCollision , не помогает=(, все равно при пересечении Игроком, бонуса программа вылетает. Подскажите пожалуйста, как исправить данную ошибку?


Код:


const count=3;
var
  Form1: TForm1;
  PlayerX,PlayerY:Double;
  i,speed:integer;
  bonus:boolean;

implementation

{$R *.dfm}

Type
  TPlayer=class(TImageSprite)
   protected
    procedure DoMove (MoveCount:integer);override;
      procedure DoCollision (Sprite:TSprite; var Done:boolean); override;
   public
    constructor create (Aparent:Tsprite);override;
    destructor destroy; override;
end;

  TEnemy = Class(TImageSprite)
   protected
    procedure DoMove (MoveCount:integer);override;
    procedure DoCollision (Sprite:TSprite; var Done:boolean); override;
   public
    constructor create (Aparent:Tsprite); override;
    destructor destroy; override;
end;
  TBonus = Class(TImageSprite)
   protected
    procedure DoMove (MoveCount:integer);override;
    procedure DoCollision (Sprite:TSprite; var Done:boolean); override;
   public
    constructor create (Aparent:Tsprite); override;
    destructor destroy; override;
end;




{ Player }

constructor TPlayer.create(Aparent: Tsprite);
begin
  inherited
  create (Aparent);
  Image:= Form1.DXImageList1.Items.Find('player');
  Width:=Image.Width;
  Height:=Image.Height;



end;

destructor TPlayer.destroy;
begin

  inherited
  Destroy;
end;

procedure TPlayer.DoCollision(Sprite: TSprite; var Done: boolean);
begin
  inherited;
  if sprite is Tenemy then dead;
  collision;
end;

procedure TPlayer.DoMove(MoveCount: integer);
begin
  inherited;
   if isLeft in Form1.DXInput1.States then
   begin
   if not bonus then
    Image:=Form1.DXImageList1.Items.Find('PlayerL');
    x:=x-speed;
    PlayerX:=x;
   end;
   if isRight in Form1.DXInput1.States then
   begin
    if not bonus then
    Image:=Form1.DXImageList1.Items.Find('player');
    x:=x+speed;
    playerX:=x;
   end;
   if isUp in Form1.DXInput1.States then
   begin
    y:=y-speed;
    playerY:=y;
   end;
   if isDown in Form1.DXInput1.States then
   begin
    y:=y+speed;
    playerY:=y;
   end;
   if bonus then
 speed:=10 else speed:=2;
    collision;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
with Tplayer.create(DXspriteengine1.engine) do
 begin
Image:= Form1.DXImageList1.Items.Find('player');
x:=35;
y:=45;
  Width:=Image.Width;
  Height:=Image.Height;
  PlayerX:=x;
  PlayerY:=y;
end;
with TBonus.create(Dxspriteengine1.engine) do
 begin
  Image:= Form1.DXImageList1.Items.Find('eat');
   x:=random(300)+300;
   y:=random(300)+300;
    width:=image.Width;
    height:=Image.Height;
 end;
for i:=1 to count do
 begin
with Tenemy.create(Dxspriteengine1.engine) do
 begin
  Image:= Form1.DXImageList1.Items.Find('enemy');
   x:=random(300)+300;
   y:=random(300)+300;
    width:=image.Width;
    height:=Image.Height;
 end;
 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;

{ TEnemy }

constructor TEnemy.create(Aparent: Tsprite);
begin
  inherited
   create (Aparent);
  Image:= Form1.DXImageList1.Items.Find('enemy');
  Width:=Image.Width;
  Height:=Image.Height;
end;

destructor TEnemy.destroy;
begin

  inherited destroy;
end;

procedure TEnemy.DoCollision(Sprite: TSprite; var Done: boolean);
begin

end;

procedure TEnemy.DoMove(MoveCount: integer);
begin
  inherited;
  collision;
  if PlayerX>x then x:=x+random(3);
  if PlayerX<x then x:=x-random(3);
  if PlayerY>y then y:=y+random(3);
  if PlayerY<y then y:=y-random(3);
  Image:=Form1.DXImageList1.Items.Find('enemy');
end;

{ TBonus }

constructor TBonus.create(Aparent: Tsprite);
begin
  inherited
 create (Aparent);
  Image:= Form1.DXImageList1.Items.Find('eat');
  Width:=Image.Width;
  Height:=Image.Height;
end;

destructor TBonus.destroy;
begin

  inherited destroy;
end;






procedure TBonus.DoCollision(Sprite: TSprite; var Done: boolean);
begin
  inherited;  collision;
 if Sprite is Tplayer then dead;

end;

procedure TBonus.DoMove(MoveCount: integer);
begin
  inherited;

end;

end.
NoHeart вне форума Ответить с цитированием
Старый 11.08.2009, 10:28   #2
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Так разбираться долго, приведи строку и сообщение об ошибке.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 11.08.2009, 10:31   #3
NoHeart
Пользователь
 
Регистрация: 15.01.2009
Сообщений: 52
По умолчанию

Project Iddqd.exe raised exception class EStackOverflow with message 'Stack Overflow' . Process stoped. Use step and run to continue.

Tenemy с Tplayer нормально пересекаются, никаких ошибок нет. Тбонус делал по аналогии, ничего не добавлял, но ошибка появилась=(

Последний раз редактировалось Stilet; 11.08.2009 в 11:12.
NoHeart вне форума Ответить с цитированием
Старый 11.08.2009, 10:40   #4
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Вы можете определить строку, где возникла ошибка?
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 11.08.2009, 10:43   #5
NoHeart
Пользователь
 
Регистрация: 15.01.2009
Сообщений: 52
По умолчанию

Нет, программа просто виснет, потом я закрываю ее через диспетчер задач.

Но я почти уверен, что проблема в этой функции.
Код:

procedure TBonus.DoCollision(Sprite: TSprite; var Done: boolean);
begin
  inherited;  collision;
 if Sprite is Tplayer then dead;

end;
ЗЫ, пробовал collision писать в конце, не писать вовсе, не помогает.

Последний раз редактировалось Stilet; 11.08.2009 в 11:13.
NoHeart вне форума Ответить с цитированием
Старый 11.08.2009, 10:46   #6
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Так не бывает . Раскидайте бреакпоинты по ключевым местам (например точки входа в методы классов, условия и пр.). Источник ошибки - половина решения.

Цитата:
Сообщение от NoHeart Посмотреть сообщение
Но я почти уверен, что проблема в этой функции.
Код:

procedure TBonus.DoCollision(Sprite: TSprite; var Done: boolean);
begin
  inherited;  collision;
 if Sprite is Tplayer then dead;

end;
collision; - как мне кажется вызывает событие DoCollision. На вроде проблемы курицы и яица.
Попробуй старт с закомментированным collision;
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Stilet; 11.08.2009 в 11:14.
Utkin вне форума Ответить с цитированием
Старый 11.08.2009, 10:57   #7
NoHeart
Пользователь
 
Регистрация: 15.01.2009
Сообщений: 52
По умолчанию

Если сделать такую поправку, то все нормально, объект Тплэер умирает, а если наоборот, то выдается ошибка.
Код:
procedure TPlayer.DoCollision(Sprite: TSprite; var Done: boolean);
begin
  inherited;
  if sprite is Tenemy then dead;
  If sprite is Tbonus then dead;
  collision;
end;
Попробовал запусать без collision; Все равно виснет =( обычно такая ошибка выдается, если не убрал ; после inherited прив создании и удалении объекта, но у меня вроде, все нормально.

На всякий случай даю исходники, если кому не лень, посмотрите пожалуйста)
Вложения
Тип файла: zip DelphiGame.zip (259.8 Кб, 11 просмотров)

Последний раз редактировалось Stilet; 11.08.2009 в 11:14.
NoHeart вне форума Ответить с цитированием
Старый 11.08.2009, 11:16   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Господа, вам что по горчичнику захотелось? Не постите рядом свои сообщения, лучше подредактируйте предидущее если оно ваше. Иначе будет обидно ссорится.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.11.2009, 16:03   #9
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

То Вадим Буренков
Правило форума - одна тема - один вопрос.
А уж если вы в чужую тему со своим вопросом...
Это хуже, чем в Тулу со своим самоваром
Создайте тему "Опять про переполнение стека" и блаженствуйте...
mihali4 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переполнение и перенос числа в ассемблере =Apple= Помощь студентам 2 03.06.2009 18:11
переполнение стека. помогите решить эту проблему Hikari Паскаль, Turbo Pascal, PascalABC.NET 1 01.06.2009 18:58
Переполнение стека Ake Паскаль, Turbo Pascal, PascalABC.NET 3 30.05.2009 22:39
Переполнение Стека Викдон Паскаль, Turbo Pascal, PascalABC.NET 0 19.12.2008 19:16
Переполнение стека при передачи функциям массивов большой размерности graphoman Общие вопросы Delphi 2 07.01.2008 21:47