PDA

Просмотр полной версии : [Программа] Пишем простенькую игру на DelphiX.


Zeinux
08.03.2014, 15:51
Всем привет! Сегодня, я расскажу и покажу, как написать простенькую игру на делфи.

Сюжет игры - очень прост: надо сбить бегающего сверху паука. /dgs Но каким бы не был сюжет, это будет реальной игрой.

И так, если у нас установлена библиотека DelphiX, то ее компоненты мы найдем на закладке DelphiX:

[Ссылки могут видеть только зарегистрированные и активированные пользователи]

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

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

[Ссылки могут видеть только зарегистрированные и активированные пользователи]

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

[Ссылки могут видеть только зарегистрированные и активированные пользователи]

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

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

[Ссылки могут видеть только зарегистрированные и активированные пользователи]

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

[Ссылки могут видеть только зарегистрированные и активированные пользователи]

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

[Ссылки могут видеть только зарегистрированные и активированные пользователи]

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

[Ссылки могут видеть только зарегистрированные и активированные пользователи]

Последний нужный нам компонент - это TDXInput, его мы тоже назовем DXInput:

[Ссылки могут видеть только зарегистрированные и активированные пользователи]

Теперь раскидываем компоненты по форме, примерно так:

[Ссылки могут видеть только зарегистрированные и активированные пользователи]

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


[Ссылки могут видеть только зарегистрированные и активированные пользователи]

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

[Ссылки могут видеть только зарегистрированные и активированные пользователи]

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


[Ссылки могут видеть только зарегистрированные и активированные пользователи]

Картинку можно взять с исходника. В пункт 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.

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

Примерно так:

[Ссылки могут видеть только зарегистрированные и активированные пользователи]

Исходник - Скачать ([Ссылки могут видеть только зарегистрированные и активированные пользователи])

ВТ - Клик ([Ссылки могут видеть только зарегистрированные и активированные пользователи] ab4dbd69fb46c3/analysis/1394282891/)