.
Пишем простенькую игру на DelphiX  (TDXDraw, TDXTimer, Delphi, TDXImageList)
Автор megabax   
13.10.2010 г.
New Page 2

Пишем простенькую игру на DelphiX  (TDXDraw, TDXTimer, Delphi, TDXImageList)

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

Сегодня мы напишем игру. Пусть ее сюжет очень просто: надо сбить бегающего сверху паука. Но тем не менее, все же это будет игра, при чем с картинками. И так, если у нас установлена библиотека DelphiX, то ее компоненты мы найдем на закладке DelphiX:

Пишем простенькую игру на DelphiX  (TDXDraw, TDXTimer, Delphi, TDXImageList)

Кидаем на форму следующие компоненты:

TDXDraw, называем его DXDraw:

Пишем простенькую игру на DelphiX  (TDXDraw, TDXTimer, Delphi, TDXImageList)

Проверим у этого компонента свойство Display, при необходимости установим удобные нам параметры экрана:

Пишем простенькую игру на DelphiX  (TDXDraw, TDXTimer, Delphi, TDXImageList)

Да, и свойство Color сделаем clWhite.

Затем кинем на форму компонент TDXSpriteEngine, который назовем DXSpriteEngine:

Пишем простенькую игру на DelphiX  (TDXDraw, TDXTimer, Delphi, TDXImageList)

Этот компонент нам надо связать с DXDraw через свойство DXDraw:

Пишем простенькую игру на DelphiX  (TDXDraw, TDXTimer, Delphi, TDXImageList)

Далее, кладем на форму TDXTimer, называя его DXTimer, свойство Interval у него устанавливаем в нуль:

Пишем простенькую игру на DelphiX  (TDXDraw, TDXTimer, Delphi, TDXImageList)

Еще нам понадобиться TDXImageList - компонент, где у нас будут храниться картинки игровых объектов (спрайтов). Так же через свойство DXDraw свяжем его с имеющимся у нас на форме компонентом TDXDraw:

Пишем простенькую игру на DelphiX  (TDXDraw, TDXTimer, Delphi, TDXImageList)

И последний компонент, который нам понадобиться - это TDXInput, его мы тоже назовем DXInput:

Пишем простенькую игру на DelphiX  (TDXDraw, TDXTimer, Delphi, TDXImageList)

В результат раскидывания компонентов по форме у нас должно получиться что то вроде этого:

Пишем простенькую игру на DelphiX  (TDXDraw, TDXTimer, Delphi, TDXImageList)

Теперь еще переименуем форму из Forma1 в frmDelphiX1 и займемся загрузкой картинок. У компонента TDXImageList есть свойство Items. До него можно добраться через Object Inspector. И так, добираемся до свойства и жмем на кнопку с тремя точками:

Пишем простенькую игру на DelphiX  (TDXDraw, TDXTimer, Delphi, TDXImageList)

у нас откроется окно, в котором мы введем соответствующие пункты и отредактируем их свойства (когда мы встаем на пункт, в Object Inspertor-e отображаются его свойства):

Пишем простенькую игру на DelphiX  (TDXDraw, TDXTimer, Delphi, TDXImageList)

что бы загрузить картинку, нужно на свойстве Picture кликнуть по кнопке с тремя точками. Откроется окно загрузки картинки:

Пишем простенькую игру на DelphiX  (TDXDraw, TDXTimer, Delphi, TDXImageList)

Сами картинки для загрузки можно скачать там же где и исходники к уроку.  В пункт GameUnit грузим человечка, в Spider паука, а в Bullet - пулю. 

Теперь переходим к программированию. В частности, нам нужно при объявлении класса формы 

TfrmDelphiX1 = class(TForm)

заменить на

TfrmDelphiX1 = class(TDXForm)

Затем нужно объявить классы для главного игрока, паука и пули, а так же написать обработчик события OnCreate. Для создания этого обработчика просто кликнем в любом месте формы два раза. У вас должна сгенериться заготовка для процедуры TfrmDelphiX1.FormCreate(Sender: TObject).

Я не буду подробно расписывать код, а просто приведу здесь его целиком, благо там есть достаточно комментариев:

unit XGame1;

 

interface

 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, DXDraws, DIB, DXSprite, DXClass, DXInput;

 

type

  TfrmDelphiX1 = class(TDXForm)

    DXDraw: TDXDraw;

    DXSpriteEngine: TDXSpriteEngine;

    DXTimer: TDXTimer;

    DXImageList: TDXImageList;

    DXInput: TDXInput;

    procedure FormCreate(Sender: TObject);

    procedure DXTimerTimer(Sender: TObject; LagCount: Integer);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

 

  TPlayerSprite = class(TImageSprite)       //Класс игрока

  protected

    procedure DoMove(MoveCount: Integer); override; // Движение

  end;

 

  TSpider = 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;

 

  TBullet = 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;

 

 

var

  frmDelphiX1: TfrmDelphiX1;

  i:boolean;

 

implementation

 

// *************** TBullet ***********

Procedure TBullet.DoMove(MoveCount: Integer);

Begin

  inherited DoMove(MoveCount);

  y:=y-5;  //проще некуда, неправда ли?

end;

 

constructor TBullet.Create(AParent: TSprite);

begin

  inherited Create(AParent);

end;

 

destructor TBullet.Destroy;

begin

  inherited Destroy; // Обязательно

end;

 

procedure TBullet.DoCollision(Sprite: TSprite; var Done: Boolean);

begin

  if Sprite is TSpider then dead;

  Collision;

end;

 

// *********** TSpider **************

Procedure TSpider.DoMove(MoveCount: Integer);

begin

   inherited DoMove(MoveCount);

   if x>= 500 then I:= false;    // когда X>= то  туда >>>

   if x<= 0 then I:= true;     // когда X<= то  туда <<<

   if i=true then X := X+1;

   if i=false then X := X-1;

   Collision;

end;

 

constructor TSpider.Create(AParent: TSprite); //Здесь всё понятно

begin

  inherited Create(AParent);

  Image := frmDelphiX1.DXImageList.Items.Find('Spider');

  Width := Image.Width;

  Height := Image.Height;

end;

 

 

destructor TSpider.Destroy;  //тут тоже

begin

  inherited Destroy;

end;

 

procedure TSpider.DoCollision(Sprite: TSprite; var Done: Boolean);

begin

  // если спрайт сталкивается с TBullet, то умирает

  if Sprite is TBullet then dead;

  Collision; // Включаем столкновение

end;

 

// ********************* TPlayerSprite *********************

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

      with TBullet.Create(Engine) do

      begin

        PixelCheck := True;

        Image := frmDelphiX1.dxImageList.Items.Find('Bullet');

        //Image := frmDelphiX1.dxImageList.Items.Find('Spider');

        //Чтобы пуля создавалась около нашего объекта

        X := Self.X+Self.Width  -40;

        //Чтобы пуля создавалась около нашего объекта

        Y := Self.Y+Self.Height -80;

        Width := Image.Width;

        Height := Image.Height;

      end;

    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;

end;

 

 

{$R *.dfm}

 

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:=10;  // 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;

 

procedure TfrmDelphiX1.DXTimerTimer(Sender: TObject; LagCount: Integer);

begin

  if not DXDraw.CanDraw then exit; // Если нет DirectX выходим

  DXInput.Update;

  DXSpriteEngine.Move(LagCount);

  DXSpriteEngine.Dead;

  DXDraw.Surface.Fill(clWhite);

  DXSpriteEngine.Draw;

  DXDraw.Flip;

end;

 

end.

Компилируем и запускаем программу. Управлять человечкмо мы можем клавишами управления курсора "влево" и "вправо". Копка "вверх" будет выпускать пулю:

Пишем простенькую игру на DelphiX  (TDXDraw, TDXTimer, Delphi, TDXImageList)

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


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


 

 

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