![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | 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 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#5  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 А делфи не умеет задавать размер стека? Программируя на ассемблере у меня была такая проблема, я размер стека увеличил, и все решилось. 
		
	
		
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#6  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Цитата: 
	
  |