Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Синтаксис
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 18.06.2008, 21:55
san-46 san-46 вне форума
Активный
 
Регистрация: 25.04.2008
Сообщения: 383
Репутация: 33
По умолчанию

Совершенно верно. TPlayerSprite1 - это просто объявление класса (декларация правил поведения), а PS1 - это уже объект, который живет своей жизнью и который что-то уже в программе делает (согласно объявленным правилам).
__________________
Не забывайте делать резервные копии
Ответить с цитированием
  #17  
Старый 18.06.2008, 21:56
Аватар для Genry
Genry Genry вне форума
Начинающий
 
Регистрация: 14.04.2008
Адрес: с. Россия, г. Курган
Сообщения: 160
Версия Delphi: 7
Репутация: 10
По умолчанию

И еще проблема:
[Ошибка] UnitMainForm.pas(61): Undeclared identifier: 'TPlayerSprite1'
[Ошибка] UnitMainForm.pas(61): Undeclared identifier: 'TPlayerSprite2'
Когда я добавил в глобальные переменные...
__________________
http://forceway.ru/
Ответить с цитированием
  #18  
Старый 18.06.2008, 21:58
Аватар для Genry
Genry Genry вне форума
Начинающий
 
Регистрация: 14.04.2008
Адрес: с. Россия, г. Курган
Сообщения: 160
Версия Delphi: 7
Репутация: 10
По умолчанию

Надо куда-то переместить типы, да?
__________________
http://forceway.ru/
Ответить с цитированием
  #19  
Старый 18.06.2008, 22:02
san-46 san-46 вне форума
Активный
 
Регистрация: 25.04.2008
Сообщения: 383
Репутация: 33
По умолчанию

Виноват, не то. Типы надо переместить выше секции implementation. А если этот класс разместить и выше класса TMainForm, то ошибки не будет.
__________________
Не забывайте делать резервные копии

Последний раз редактировалось san-46, 18.06.2008 в 22:07.
Ответить с цитированием
  #20  
Старый 18.06.2008, 22:04
Аватар для Genry
Genry Genry вне форума
Начинающий
 
Регистрация: 14.04.2008
Адрес: с. Россия, г. Курган
Сообщения: 160
Версия Delphi: 7
Репутация: 10
По умолчанию

И куча ошибок, после того, как я добавил в глобальные переменные...
Изображения
Тип файла: jpg error2.JPG (89.0 Кбайт, 3 просмотров)
__________________
http://forceway.ru/
Ответить с цитированием
  #21  
Старый 18.06.2008, 22:06
Аватар для Genry
Genry Genry вне форума
Начинающий
 
Регистрация: 14.04.2008
Адрес: с. Россия, г. Курган
Сообщения: 160
Версия Delphi: 7
Репутация: 10
По умолчанию

О, спасибо, теперь все ошибки прошли... :-)
__________________
http://forceway.ru/
Ответить с цитированием
  #22  
Старый 18.06.2008, 22:11
Аватар для Genry
Genry Genry вне форума
Начинающий
 
Регистрация: 14.04.2008
Адрес: с. Россия, г. Курган
Сообщения: 160
Версия Delphi: 7
Репутация: 10
Вопрос

Еще вопросы по процедуры (я изменил 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?
__________________
http://forceway.ru/
Ответить с цитированием
  #23  
Старый 18.06.2008, 22:18
san-46 san-46 вне форума
Активный
 
Регистрация: 25.04.2008
Сообщения: 383
Репутация: 33
По умолчанию

Зачем же? PlayerSprite1 - это экземпляр, с ним работаем. TPlayerSprite1 - объявление класса - задекларировали его и все.
__________________
Не забывайте делать резервные копии
Ответить с цитированием
  #24  
Старый 18.06.2008, 22:23
san-46 san-46 вне форума
Активный
 
Регистрация: 25.04.2008
Сообщения: 383
Репутация: 33
По умолчанию

В Delphi принято: с буквы "Т" начинаются объявления типов (классов, событий, структур). А именовать переменные с "Т" не принято (чтобы не запутаться).
__________________
Не забывайте делать резервные копии
Ответить с цитированием
  #25  
Старый 18.06.2008, 22:25
Аватар для Genry
Genry Genry вне форума
Начинающий
 
Регистрация: 14.04.2008
Адрес: с. Россия, г. Курган
Сообщения: 160
Версия Delphi: 7
Репутация: 10
Смущение И еще вопросик...

Код:
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, когда меняется рисунок, так и оставить?
__________________
http://forceway.ru/
Ответить с цитированием
  #26  
Старый 18.06.2008, 22:30
san-46 san-46 вне форума
Активный
 
Регистрация: 25.04.2008
Сообщения: 383
Репутация: 33
По умолчанию

Код:
TPlayerSprite1.Create(Engine).Image := ...
Это неправильно. Ведь получается, что в программе постоянно создаются экземпляры классов TPlayerSprite1, причем "зависших", т.е. на них нет ссылок. Из-за этого даже пристрелить мы их не можем (когда надо будет).
При такой организации ваша программа быстро забъет оперативку. Да и что делать с созданными в огромном количестве объектов, если они все равно не доступны.
Если уж объявлены переменные этих классов (PlayerSprite1), то и обращаться надо уже к ним:
Код:
PlayerSprite1.Image := ...
__________________
Не забывайте делать резервные копии

Последний раз редактировалось san-46, 18.06.2008 в 22:34.
Ответить с цитированием
  #27  
Старый 18.06.2008, 22:38
Аватар для Genry
Genry Genry вне форума
Начинающий
 
Регистрация: 14.04.2008
Адрес: с. Россия, г. Курган
Сообщения: 160
Версия Delphi: 7
Репутация: 10
По умолчанию

ОГРОМНОЕ СПАСИБО!!!
__________________
http://forceway.ru/
Ответить с цитированием
  #28  
Старый 18.06.2008, 22:47
san-46 san-46 вне форума
Активный
 
Регистрация: 25.04.2008
Сообщения: 383
Репутация: 33
По умолчанию

Что выше понаписал тоже неправильно.
Конструкции типа: PlayerSprite1.Image := ... применяются за бортом класса TPlayerSprite1 (в процедурах TMainForm, например), а внутри (в процедуре TPlayerSprite1.DoMove) надо обращаться просто к доступным полям этого класса: Image := ... (без квалификатора PlayerSprite1)
Понятно ли?
__________________
Не забывайте делать резервные копии
Ответить с цитированием
  #29  
Старый 19.06.2008, 12:43
Аватар для Genry
Genry Genry вне форума
Начинающий
 
Регистрация: 14.04.2008
Адрес: с. Россия, г. Курган
Сообщения: 160
Версия Delphi: 7
Репутация: 10
По умолчанию

Вроде бы да, это чтобы небыло рекурсии? Я исправлю исходник.
__________________
http://forceway.ru/
Ответить с цитированием
  #30  
Старый 19.06.2008, 13:31
san-46 san-46 вне форума
Активный
 
Регистрация: 25.04.2008
Сообщения: 383
Репутация: 33
По умолчанию

Не совсем из-за рекурсии, вернее, совсем не из-за нее. Решил ответить, т.к. неправильное понимание ситации может привести к плачевным последствиям.
Если ваша форма единственная, то правильнее объявлять переменные PlayerSprite1 и PlayerSprite2 в классе формы, а не на глобальном уровне. Чтобы владельцем этих переменных была форма. Тогда становится ясно почему обращение к PlayerSprite1.Image в классе TPlayerSprite1 не может иметь место - компилятор тут же даст ошибку, т.к. область видимости переменной PlayerSprite1 ограничена классом TMainForm и из класса TPlayerSprite1 обращение к такой переменной может быть только через квалификатор: MainForm.PlayerSprite1, да и то, если переменная объявлена в секции public класса TMainForm.
__________________
Не забывайте делать резервные копии
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter