Партнерская программа школы программирования
New Page 2
Усовершенствуем
нашу игру на DelphiX (TDXDraw, TDXTimer,
Delphi, TDXImageList)
Исходники к уроку можно скачать здесь.
Сегодня мы немножко улучшим нашу игру,
которую написали на прошлом
уроке. Вот что мы сделаем:
- Если пуля вылетает за пределы экрана, то
она исчезает.
- При выстреле, если пользователь долго не
отпускает кнопку "Огонь", пули
вылетают не кучей, а очередями (через
определенный промежуток времени).
- при попадании в паука происходит взрыв.
Если у вас нет исходников игры прошлого
урока, скачайте их здесь.
И так, вот какие изменения в программу мы
внесем:
В объявление класса игрока:
TPlayerSprite
=
class(TImageSprite)
//Класс
игрока
protected
Distance:integer;
//расстояние
которое пролетела пуля
oldDistance:integer;
//расстояние
которое пролетела предыдущая пуля
procedure
DoMove(MoveCount:
Integer);
override;
//
Движение
end;
|
Создадим новый класс TExploit (взрыв):
TExploit=class(TImageSprite)
protected
procedure
DoCollision(Sprite:
TSprite;
var
Done:
Boolean);
override;
procedure
DoMove(MoveCount:
Integer);
override;
public
constructor
Create(AParent:
TSprite);
override;
destructor
Destroy;
override;
end;
|
Реализуем класс взрыва (проще некуда):
//
************** TExploit *********
procedure
TExploit.DoCollision(Sprite:
TSprite;
var
Done:
Boolean);
begin
Collision;
end;
Procedure
TExploit.DoMove(MoveCount:
Integer);
Begin
inherited
DoMove(MoveCount);
end;
constructor
TExploit.Create(AParent:
TSprite);
begin
inherited
Create(AParent);
end;
destructor
TExploit.Destroy;
begin
inherited
Destroy;
//
Обязательно
end;
|
Внесем изменения в класс пули:
Procedure
TBullet.DoMove(MoveCount:
Integer);
Begin
inherited
DoMove(MoveCount);
y:=y-5;
//проще
некуда,
неправда
ли?
if
y<50
then
Dead;
//если
пуля долетела до конца, то она исчезает
end;
|
Сделаем так, что бы паук взрывался при
попадании в него:
procedure
TSpider.DoCollision(Sprite:
TSprite;
var
Done:
Boolean);
begin
//
если спрайт сталкивается с TBullet, то
умирает
if
Sprite
is
TBullet
then
dead;
Collision;
//
Включаем
столкновение
with
TExploit.Create(Engine)
do
begin
PixelCheck
:=
True;
Image
:=
frmDelphiX1.dxImageList.Items.Find('Shoot');
X
:=
Self.X;
Y
:=
Self.Y;
Width
:=
Image.Width;
Height
:=
Image.Height;
AnimCount
:=
Image.PatternCount;
AnimLooped
:=
False;
AnimSpeed
:=
3/1000;
AnimPos
:=
0;
end;
end;
|
Изменим алгоритм выпуска пули, перепишем
метод TPlayerSprite.DoMove:
Procedure
TPlayerSprite.DoMove(MoveCount:
Integer);
begin
inherited
DoMove(MoveCount);
//
при
нажатии
двигаем
объект
влево
if
isLeft
in
frmDelphiX1.DXInput.States
then
x:=x-5;
//
при
нажатии
двигаем
объект
вправо
if
isRight
in
frmDelphiX1.DXInput.States
then
x:=x+5;
//
при нажатие вверх создаётся наша пулька
if
isup
in
frmDelphiX1.DXInput.States
then
begin
if
Distance-oldDistance>=17
then
begin
Inc(Distance);
with
TBullet.Create(Engine)
do
begin
PixelCheck
:=
True;
Image
:=
frmDelphiX1.dxImageList.Items.Find('Bullet');
//Чтобы
пуля создавалась около нашего объекта
X
:=
Self.X+Self.Width
-40;
//Чтобы
пуля создавалась около нашего объекта
Y
:=
Self.Y+Self.Height
-80;
Width
:=
Image.Width;
Height
:=
Image.Height+2;
end;
end;
oldDistance
:=
Distance;
//после
создания пули - последняя становится
первой
Distance:=0;
end;
if
y
>=
frmDelphiX1.DXDraw.SurfaceHeight-image.Height
then
//не
пускаем
y
:=
frmDelphiX1.DXDraw.SurfaceHeight-image.Height;
//объект
if
x
>=
frmDelphiX1.DXDraw.SurfaceWidth
-image.Width
then
//за
границы
x
:=
frmDelphiX1.DXDraw.SurfaceWidth
-image.Width;
//формы
if
y
<=
0
then
y
:=
1;
if
x
<=
0
then
x:=1;
Distance:=Distance+MoveCount
end; |
еще немного изменим координаты паука (выделено
красным):
procedure
TfrmDelphiX1.FormCreate(Sender:
TObject);
begin
i:=true;
with
TSpider.Create(DXSpriteEngine.Engine)
do
begin
PixelCheck
:=
True;
//
для столкновения просчитывает каждую
точку
Image
:=
frmDelphiX1.dxImageList.Items.Find('Spider');
//ищем
спрайт
в
ImageList`е
x:=10;
//
x координаты
y:=100;
//
y координаты
Width
:=
Image.Width;
//ширина
равна ширине спрайта
Height
:=
Image.Height;
//высота
равна высоте спрайта
end;
with
TPlayerSprite.Create(DXSpriteEngine.Engine)
do
begin
PixelCheck
:=
True;
Image
:=
frmDelphiX1.dxImageList.Items.Find('GameUnit');
x:=500;
y:=500;
Width
:=
Image.Width;
Height
:=
Image.Height;
end;
end; |
С программой покончено, теперь нам надо
"подцепить" к игре картинку взрыва.
Выделяем компонент TDXImageList и в
инспекторе объектов редактируем свойство
Items*:

Добавляем в список новую картинку (Shoot) и
редактируем его свойства*:

В частности, нам надо указать размер кадра
(свойства PatternHeight и PatternWidth), а так же
загрузить через свойство Picture картинку
взрыва:

Загрузка картинки осуществляется, когда
вы нажимаете на кнопку с тремя точками и отрывается
вот такой диалог*:

Заметьте, все картинки взрыва находятся в
одном файле. Поэтому мы и указывает размер
кадра. Ширина кадра 48, а ширина картинки со
взрывом 192= 48*4.
Вот как у нас будет выглядеть игра:

Правда, дым от взрыва остается на экране.
Сделать так, что бы он исчезал, будет вашим
домашним заданием.
Исходники к уроку можно скачать здесь
Скриншоты, помеченные знаком *,
являются цитатами и иллюстрациями в
соответствии со ст. 1274 ГК РФ программного
продукта "Delphi", авторское право на
который принадлежит Borland Delphi..
|