![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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. |