Программирование - это просто
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   
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 г. )
 
« След.   Пред. »
 
© 2021 Программирование - это просто
Joomla! - свободное программное обеспечение, распространяемое по лицензии GNU/GPL.
Русская локализация © 2005-2008 Joom.Ru - Русский Дом Joomla!
Design by Mamboteam.com | Powered by Mambobanner.de
Я принимаю Яндекс.Деньги