![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Прошу подсказать, изучаю DelphiX четвертый день, решил просто потренироваться - квадратом бегаю по экрану, в разных местах появляются еще почти такие же но другого класса, и хотел сделать так чтобы при столкновении происходило изменение координат у последних(вначале хотел сделать что то типа змейки) в общем всё как бы ничего и если пишу в столконовении Dead то они уничтожаются, но вот если пишу в DoMove главного квадрата сохранение координат в две переменные(x1:=x; y1:=y; ) а потом в DoMove квадратов которые появляются пишу x:=x1; y:=y1; в запущеной игре при столкновении вылазит ошибка "Stack Overflow" и игра закрывается немогу понять в чем дело. Может и это не будет походить на змейку и что то подобное ей а просто квадраты будут лепиться друг ко другу но меня интересует откуда берется эта ошибка и как от нее избавиться. Ну если кто то подскажет как написать змейку буду более благодарен
|
#2
|
||||
|
||||
![]() Ищи ошибку где то в алгоритме... "Stack Overflow" означает переполнение стека...т.е. где то засоряется память, неосбобождается какая то больша структура или что то подобное...на первый взгляд не скажешь...попробуй поставить break где то перед возникновением ошибки...
В начале был Бит, потом Байт и только потом появилось Слово... |
#3
|
|||
|
|||
![]() Пусть я и чайник но узнать где что исправить или как вообще сделать лучше - хочется. Вот код не пугайтеь ))
Код:
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, 07.11.2009 в 11:05. |
#4
|
||||
|
||||
![]() как я уже говорил 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
|
|||
|
|||
![]() А делфи не умеет задавать размер стека? Программируя на ассемблере у меня была такая проблема, я размер стека увеличил, и все решилось.
|
#6
|
||||
|
||||
![]() Цитата:
TAleD = class(TUser) public function HelpMe(ASubject, ARequest: String): String; function GiveMeExample(ASubject: String): TStringList; procedure WriteReview(APost: Integer; ADescription: TStringList); end; |
#7
|
|||
|
|||
![]() так в чем ошибка у меня в коде? где что исправить я так и не пойм? (((
кстати сейчас делаю игру по мануалу вылазит то же самое после нескольких секунд игры хотя сначала все нормально работает... Попробую еще пока что нибудь сделать, если не получится приведу код. |