.
Усовершенствуем нашу игру на DelphiX  (TDXDraw, TDXTimer, Delphi, TDXImageList)
Автор megabax   
28.12.2010 г.
Партнерская программа школы программирования 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*:

Усовершенствуем нашу игру на DelphiX  (TDXDraw, TDXTimer, Delphi, TDXImageList)

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

Усовершенствуем нашу игру на DelphiX  (TDXDraw, TDXTimer, Delphi, TDXImageList)

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

Усовершенствуем нашу игру на DelphiX  (TDXDraw, TDXTimer, Delphi, TDXImageList)

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

Усовершенствуем нашу игру на DelphiX  (TDXDraw, TDXTimer, Delphi, TDXImageList)

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

Вот как у нас будет выглядеть игра:

Усовершенствуем нашу игру на DelphiX  (TDXDraw, TDXTimer, Delphi, TDXImageList)

Правда, дым от взрыва остается на экране. Сделать так, что бы он исчезал, будет вашим домашним заданием.

Исходники к уроку можно скачать здесь


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


 

 

Последнее обновление ( 06.11.2011 г. )