Программирование - это просто
Advertisement
Главная arrow Уроки Delphi arrow Пишем компьютерную игру на Delphi arrow Усовершенствуем нашу игру на DelphiX  (TDXDraw, TDXTimer, Delphi, TDXImageList)
30.11.2021 г.
Главное меню
Главная
Интернет магазин
Программные продукты
Биржевые роботы
Искусственный интеллект
Математика и информатика
1С:Предприятие
Уроки C#
Уроки Delphi
Уроки программирования
Web-программирование
Дизайн и графика
Компьютер для блондинок
Исходники
Статьи
Платный раздел
Рассказы про компьютеры
Хитрости и секреты
Системный подход
Размышления
Наука для чайников
Друзья сайта
Excel-это не сложно
Все о финансах
.
Усовершенствуем нашу игру на DelphiX  (TDXDraw, TDXTimer, Delphi, TDXImageList) Печать E-mail
Автор 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 г. )
 
« След.   Пред. »
 
© 2021 Программирование - это просто
Joomla! - свободное программное обеспечение, распространяемое по лицензии GNU/GPL.
Русская локализация © 2005-2008 Joom.Ru - Русский Дом Joomla!
Design by Mamboteam.com | Powered by Mambobanner.de
Я принимаю Яндекс.Деньги