![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны | 
![]()  | 
	
	
| 
		 | 
	Опции темы | Поиск в этой теме | Опции просмотра | 
| 
		 
			 
			#16  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Совершенно верно. TPlayerSprite1 - это просто объявление класса (декларация правил поведения), а PS1 - это уже объект, который живет своей жизнью и который что-то уже в программе делает (согласно объявленным правилам). 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#17  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 И еще проблема: 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	[Ошибка] UnitMainForm.pas(61): Undeclared identifier: 'TPlayerSprite1' [Ошибка] UnitMainForm.pas(61): Undeclared identifier: 'TPlayerSprite2' Когда я добавил в глобальные переменные...  | 
| 
		 
			 
			#18  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Надо куда-то переместить типы, да? 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#19  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Виноват, не то. Типы надо переместить выше секции implementation. А если этот класс разместить и выше класса TMainForm, то ошибки не будет. 
		
	
		
		
		
		
			
		
		
		
		
		
			Последний раз редактировалось san-46, 18.06.2008 в 22:07.  | 
| 
		 
			 
			#20  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 И куча ошибок, после того, как я добавил в глобальные переменные...  
		
	
		
		
			![]()  | 
| 
		 
			 
			#21  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 О, спасибо, теперь все ошибки прошли... :-) 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#22  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Еще вопросы по процедуры  
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	   (я изменил PS1 на PlayerSprite1 и PS2 на PlayerSprite2)Код: 
	procedure TPlayerSprite1.DoCollision(Sprite: TSprite; var Done: Boolean);
begin
  if Sprite is TPlayerSprite2 then
  begin
    if TPlayerSprite1Action=obichniy then // îáû÷íàÿ ïîçèöèÿ
      begin
        case TPlayerSprite2Action of
        obichniy: exit;
        BottomBlock: exit;
        TopBlock: exit;
        TopUdar: TPlayerSprite1Health:=TPlayerSprite1Health-10;
        UdarLevoy: TPlayerSprite1Health:=TPlayerSprite1Health-5;
        UdarPravoy: TPlayerSprite1Health:=TPlayerSprite1Health-5;
        UdarNiz: TPlayerSprite1Health:=TPlayerSprite1Health-7;
        UdarNogoyZemlyaLevo: TPlayerSprite1Health:=TPlayerSprite1Health-8;
        UdarNogoyZemlyaPravo: TPlayerSprite1Health:=TPlayerSprite1Health-8;
        end;
      end
    else
    if TPlayerSprite1Action=BottomBlock then // íèæíèé áëîê
      begin
        case TPlayerSprite2Action of
        obichniy: exit;                    
        BottomBlock: exit;
        TopBlock: exit;
        TopUdar: TPlayerSprite1Health:=TPlayerSprite1Health-10;
        UdarLevoy: TPlayerSprite1Health:=TPlayerSprite1Health-5;
        UdarPravoy: TPlayerSprite1Health:=TPlayerSprite1Health-5;
        UdarNiz: TPlayerSprite1Health:=TPlayerSprite1Health-1;
        UdarNogoyZemlyaLevo: TPlayerSprite1Health:=TPlayerSprite1Health-1;
        UdarNogoyZemlyaPravo: TPlayerSprite1Health:=TPlayerSprite1Health-1;
        end;
      end
    else
    if TPlayerSprite1Action=TopBlock then // âåðõíèé áëîê
      begin
        case TPlayerSprite2Action of
        obichniy: exit;                    
        BottomBlock: exit;                                                            
        TopBlock: exit;
        TopUdar: TPlayerSprite1Health:=TPlayerSprite1Health-1;
        UdarLevoy: TPlayerSprite1Health:=TPlayerSprite1Health-1;
        UdarPravoy: TPlayerSprite1Health:=TPlayerSprite1Health-1;
        UdarNiz: TPlayerSprite1Health:=TPlayerSprite1Health-7;
        UdarNogoyZemlyaLevo: TPlayerSprite1Health:=TPlayerSprite1Health-8;
        UdarNogoyZemlyaPravo: TPlayerSprite1Health:=TPlayerSprite1Health-8;
        end;
      end
    else
  end;
end;Надо везде изменить TPlayerSprite1 на PlayerSprite1?  | 
| 
		 
			 
			#23  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Зачем же? PlayerSprite1 - это экземпляр, с ним работаем. TPlayerSprite1 - объявление класса - задекларировали его и все. 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#24  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 В Delphi принято: с буквы "Т" начинаются объявления типов (классов, событий, структур). А именовать переменные с "Т" не принято (чтобы не запутаться). 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#25  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Код: 
	Procedure TPlayerSprite1.DoMove(MoveCount: Integer);
begin
  inherited DoMove(MoveCount);
    // ïðè íàæàòèè äâèãàåì îáúåêò âëåâî
    if isLeft in MainForm.DXInput.States then
      begin
      x:=x-15;
      TPlayerSprite1.Create(Engine).Image := MainForm.DXImageListAnime1.Items.Find('obichniy');
      end;
    // ïðè íàæàòèè äâèãàåì îáúåêò âïðàâî
    if isRight in MainForm.DXInput.States then
      begin
      x:=x+15;
      TPlayerSprite1.Create(Engine).Image := MainForm.DXImageListAnime1.Items.Find('obichniy');
      end;
    // íèæíèé áëîê
    if isButton1 in MainForm.DXInput.States then
      TPlayerSprite1.Create(Engine).Image := MainForm.DXImageListAnime1.Items.Find('BottomBlock');
    // âåðõíèé áëîê
    if isButton2 in MainForm.DXInput.States then
      TPlayerSprite1.Create(Engine).Image := MainForm.DXImageListAnime1.Items.Find('TopBlock');
    // âåðõíèé óäàð
    if isButton3 in MainForm.DXInput.States then
      with TPlayerSprite1.Create(Engine) do
      begin
        PixelCheck := True;
        Image:=MainForm.DXImageListAnime1.Items.Find('TopUdar');
        Width := Image.Width;
        Height := Image.Height;
        if maxPrig<300 then
          begin
          Y:=Y+5;
          X:=X+1;
          end
        else
          begin
            if y=10 then exit;
              Y:=Y-5;
          end;
        AnimSpeed := 10 / 1000;          //ñêîðîñòü àíèìàöèè
      end;
    // óäàð ëåâîé
    if isButton4 in MainForm.DXInput.States then
      TPlayerSprite1.Create(Engine).Image := MainForm.DXImageListAnime1.Items.Find('UdarLevoy');
    // óäàð ïðàâîé
    if isButton5 in MainForm.DXInput.States then
      TPlayerSprite1.Create(Engine).Image := MainForm.DXImageListAnime1.Items.Find('UdarPravoy');
    // íèæíÿÿ ïîäíîæêà
    if isButton5 in MainForm.DXInput.States then
      TPlayerSprite1.Create(Engine).Image := MainForm.DXImageListAnime1.Items.Find('UdarNiz');
    // óäàð ëåâîé íîãîé
    if isButton5 in MainForm.DXInput.States then
      TPlayerSprite1.Create(Engine).Image := MainForm.DXImageListAnime1.Items.Find('UdarNogoyZemlyaLevo');
    // óäàð ïðàâîé íîãîé
    if isButton5 in MainForm.DXInput.States then
      TPlayerSprite1.Create(Engine).Image := MainForm.DXImageListAnime1.Items.Find('UdarNogoyZemlyaPravo');
    if  y >= MainForm.DXDraw.SurfaceHeight-image.Height then  //íå ïóñêàåì
      y := MainForm.DXDraw.SurfaceHeight-image.Height;        //îáúåêò
    if  x >= MainForm.DXDraw.SurfaceWidth -image.Width  then  //çà ãðàíèöû
      x := MainForm.DXDraw.SurfaceWidth -image.Width;         //ôîðìû
    if  y <= 0 then
      y := 1;
    if  x <= 0 then
      x:=1;
end;Тут часто вызывается метод Create, когда меняется рисунок, так и оставить?  | 
| 
		 
			 
			#26  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Код: 
	TPlayerSprite1.Create(Engine).Image := ... При такой организации ваша программа быстро забъет оперативку. Да и что делать с созданными в огромном количестве объектов, если они все равно не доступны. Если уж объявлены переменные этих классов (PlayerSprite1), то и обращаться надо уже к ним: Код: 
	PlayerSprite1.Image := ... Последний раз редактировалось san-46, 18.06.2008 в 22:34.  | 
| 
		 
			 
			#27  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 ОГРОМНОЕ СПАСИБО!!! 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#28  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Что выше понаписал тоже неправильно. 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	Конструкции типа: PlayerSprite1.Image := ... применяются за бортом класса TPlayerSprite1 (в процедурах TMainForm, например), а внутри (в процедуре TPlayerSprite1.DoMove) надо обращаться просто к доступным полям этого класса: Image := ... (без квалификатора PlayerSprite1) Понятно ли?  | 
| 
		 
			 
			#29  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Вроде бы да, это чтобы небыло рекурсии? Я исправлю исходник. 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	 | 
| 
		 
			 
			#30  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Не совсем из-за рекурсии, вернее, совсем не из-за нее. Решил ответить, т.к. неправильное понимание ситации может привести к плачевным последствиям. 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	Если ваша форма единственная, то правильнее объявлять переменные PlayerSprite1 и PlayerSprite2 в классе формы, а не на глобальном уровне. Чтобы владельцем этих переменных была форма. Тогда становится ясно почему обращение к PlayerSprite1.Image в классе TPlayerSprite1 не может иметь место - компилятор тут же даст ошибку, т.к. область видимости переменной PlayerSprite1 ограничена классом TMainForm и из класса TPlayerSprite1 обращение к такой переменной может быть только через квалификатор: MainForm.PlayerSprite1, да и то, если переменная объявлена в секции public класса TMainForm.  |