|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#16
|
|||
|
|||
Совершенно верно. TPlayerSprite1 - это просто объявление класса (декларация правил поведения), а PS1 - это уже объект, который живет своей жизнью и который что-то уже в программе делает (согласно объявленным правилам).
Не забывайте делать резервные копии |
#17
|
||||
|
||||
И еще проблема:
[Ошибка] UnitMainForm.pas(61): Undeclared identifier: 'TPlayerSprite1' [Ошибка] UnitMainForm.pas(61): Undeclared identifier: 'TPlayerSprite2' Когда я добавил в глобальные переменные... http://forceway.ru/ |
#18
|
||||
|
||||
Надо куда-то переместить типы, да?
http://forceway.ru/ |
#19
|
|||
|
|||
Виноват, не то. Типы надо переместить выше секции implementation. А если этот класс разместить и выше класса TMainForm, то ошибки не будет.
Не забывайте делать резервные копии Последний раз редактировалось san-46, 18.06.2008 в 22:07. |
#20
|
||||
|
||||
И куча ошибок, после того, как я добавил в глобальные переменные...
http://forceway.ru/ |
#21
|
||||
|
||||
О, спасибо, теперь все ошибки прошли... :-)
http://forceway.ru/ |
#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? http://forceway.ru/ |
#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, когда меняется рисунок, так и оставить? http://forceway.ru/ |
#26
|
|||
|
|||
Код:
TPlayerSprite1.Create(Engine).Image := ... При такой организации ваша программа быстро забъет оперативку. Да и что делать с созданными в огромном количестве объектов, если они все равно не доступны. Если уж объявлены переменные этих классов (PlayerSprite1), то и обращаться надо уже к ним: Код:
PlayerSprite1.Image := ... Не забывайте делать резервные копии Последний раз редактировалось san-46, 18.06.2008 в 22:34. |
#27
|
||||
|
||||
ОГРОМНОЕ СПАСИБО!!!
http://forceway.ru/ |
#28
|
|||
|
|||
Что выше понаписал тоже неправильно.
Конструкции типа: PlayerSprite1.Image := ... применяются за бортом класса TPlayerSprite1 (в процедурах TMainForm, например), а внутри (в процедуре TPlayerSprite1.DoMove) надо обращаться просто к доступным полям этого класса: Image := ... (без квалификатора PlayerSprite1) Понятно ли? Не забывайте делать резервные копии |
#29
|
||||
|
||||
Вроде бы да, это чтобы небыло рекурсии? Я исправлю исходник.
http://forceway.ru/ |
#30
|
|||
|
|||
Не совсем из-за рекурсии, вернее, совсем не из-за нее. Решил ответить, т.к. неправильное понимание ситации может привести к плачевным последствиям.
Если ваша форма единственная, то правильнее объявлять переменные PlayerSprite1 и PlayerSprite2 в классе формы, а не на глобальном уровне. Чтобы владельцем этих переменных была форма. Тогда становится ясно почему обращение к PlayerSprite1.Image в классе TPlayerSprite1 не может иметь место - компилятор тут же даст ошибку, т.к. область видимости переменной PlayerSprite1 ограничена классом TMainForm и из класса TPlayerSprite1 обращение к такой переменной может быть только через квалификатор: MainForm.PlayerSprite1, да и то, если переменная объявлена в секции public класса TMainForm. Не забывайте делать резервные копии |