Регистрация Главная Сообщество
Сообщения за день Справка Регистрация
Навигация
Zhyk.org LIVE! Реклама на Zhyk.org Правила Форума Награды и достижения Доска "почета"

Ответ
 
Опции темы
Старый 08.03.2014, 15:51   #1
 Разведчик
Аватар для Zeinux
 
Zeinux знает себе ценуZeinux знает себе ценуZeinux знает себе ценуZeinux знает себе ценуZeinux знает себе ценуZeinux знает себе ценуZeinux знает себе ценуZeinux знает себе ценуZeinux знает себе ценуZeinux знает себе ценуZeinux знает себе цену
Регистрация: 15.02.2014
Сообщений: 14
Популярность: 4534
Сказал(а) спасибо: 9
Поблагодарили 14 раз(а) в 11 сообщениях
 
Smile Пишем простенькую игру на DelphiX.

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

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

И так, если у нас установлена библиотека 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.
Компилируем и запускаем программу. Управлять человечкмо мы можем клавишами управления курсора "влево" и "вправо". Копка "вверх" будет выпускать пулю:

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


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

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

ВТ - [Ссылки могут видеть только зарегистрированные пользователи. ]
  Ответить с цитированием
Пользователь сказал cпасибо:
NebesaBag (08.03.2014)
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Помогите!] Сделайте простенькую прогу!! =loyal= Общение и обсуждение 8 23.04.2011 12:39

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 02:24.

Пишите нам: [email protected]
Copyright © 2024 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net