Прежде чем начать объясню решение Д/З:

1. Сделайте так, чтобы при уходе патрона из зоны видимости он уничтожался

Это очень легко сделать достаточно в процедуру DoMove патрона вставить: 

if y<= 0 then Dead;

Нужно это для того чтобы повысить производительность игры. 

2. Сделайте чтобы патроны стреляли очередями, а не кучами как у меня

Вот эта задача была уже посложнее первой. Во первых так как я сделал в первой части этого туториала делать нельзя из за причины небольшой кривости DelphiX, он может держать только определённое количество спрайтов, а если их больше он или выходит или подвисает. Вот что делаем вот-так:
в класс с плеером добавляем две переменные и он теперь выглядит вот так (я добавил комментарии к тем строчкам которые изменились):

TPlayerSprite = class(TImageSprite)
Private 
lngpolet:integer; //расстояние которое пролетела пуля 
oldlngpolet:integer; //расстояние которое пролетела предыдущая пуля
protected
procedure DoMove(MoveCount: Integer); override;
end;

И процедура DoMove класса PlayerSprite изменяется следующим образом:

Procedure TPlayerSprite.DoMove(MoveCount: Integer); 
Begin
inherited DoMove(MoveCount);
if isLeft in Form1.DXInput1.States then x:=x-5; 
if isRight in Form1.DXInput1.States then X:=x+5; 
if isup in Form1.DXInput1.States then 
begin
if lngpolet-oldlngpolet>=250 then // Если расстояние между пулями меньше 250 то пуля 
//не криатиться пуля
begin
Inc(lngpolet);
with TPlayerFa.Create(Engine) do
begin
PixelCheck := True;
Image := form1.dxImageList1.Items.Find('Pula');
X := Self.X+Self.Width -40; 
Y := Self.Y+Self.Height -80 ; 
Width := Image.Width;
Height := Image.Height;
end;
oldlngpolet := lngpolet; //после создании пули последняя становится первой
end;
end;
if y >= form1.DXDraw1.SurfaceHeight-image.Height then 
y := form1.DXDraw1.SurfaceHeight-image.Height; 
if x >= form1.DXDraw1.SurfaceWidth -image.Width then 
x := form1.DXDraw1.SurfaceWidth -image.Width; 
if y <= 0 then
y := 1;
if x <= 0 then
x:=1;
lngpolet := lngpolet + MoveCount; // расстояние увеличиваем когда пуля движется 
end;

Вот и всё что и требовалось сделать.

Создание анимации

Анимация в DelphiX строится следующим образом:

т.е по кадрово и у каждого кадра должен быть одинаковый размер.
В данной ситуации: ширина 40, высота 38. Давайте теперь применим ее к нашей игре.
Лезем в DXImageList, находим наш спрайт Pula и загружаем картинку с анимацией.
Далее устанавливаем свойства спрайта -
ширину и высоту изображения и в процедура DoMove класса PlayerSprite изменяем следующим образом:

Procedure TPlayerSprite.DoMove(MoveCount: Integer);
begin
inherited DoMove(MoveCount);
if isLeft in Form1.DXInput1.States then x:=x-5; 
if isRight in Form1.DXInput1.States then X:=x+5; 
if isup in Form1.DXInput1.States then 
begin
if lngpolet-oldlngpolet>=250 then
begin
Inc(lngpolet);
with TPlayerFa.Create(Engine) do
begin
PixelCheck := True;
Image := form1.dxImageList1.Items.Find('Pula');
X := Self.X+Self.Width -40; 
Y := Self.Y+Self.Height -80 ; 
Width := Image.Width;
Height := Image.Height;
AnimCount := Image.PatternCount; //число кадров
AnimLooped := True; //повторять ли анимацию
AnimSpeed := 10 / 1000; //скорость анимации
end;
oldlngpolet := lngpolet;
end;
end;
if y >= form1.DXDraw1.SurfaceHeight-image.Height then 
y := form1.DXDraw1.SurfaceHeight-image.Height; 
if x >= form1.DXDraw1.SurfaceWidth -image.Width then 
x := form1.DXDraw1.SurfaceWidth -image.Width; 
if y <= 0 then
y := 1;
if x <= 0 then
x:=1;
lngpolet := lngpolet + MoveCount;
end;

Можно проделать тоже самое с другими классами для придания реалистичности игры.

Check Also

Проект Red Team: роли и области экспертизы. Колонка Дениса Макрушина

Красная команда имитирует действия атакующего, чтобы помочь оценить эффективность защитных…

Оставить мнение