"Как много игр то хороших,
Да только сегодня не до них"
Автор.
Здравствуйте! Сегодня мы создадим первую, и надеюсь не последнюю игрушку, смысл у нас будет такой: Мы маленький космический корабль нам надо уничтожить большой статичный космический корабль. (прим.автора: "Этот пример научит мыслить по DelphiX`ски").
Ну что приступим, запускаем Delphi, кидаем на форму следующие компоненты:
DXDraw- и проставляем в нем следующие опции в Object Inspector:
Align = alClient - это нужно для того чтобы DXDraw "обтянул" всю форму.
Display = 800x600x16 - почему спросите вы не 800x600x24 да потому что, не все видеокарты поддерживают 24 битный режим.
Options-doFullScreen = True если хочешь чтобы твоя игра была на весь экран и ещё надо в свойствах формы поставить: BorderStyle = bsnone.
TDXSpriteEngine - Сам движок для работы со спрайтами. В нём нужно только выбрать в поле DXDraw сам DXDraw1.
TDXTimer - Он вообще то и, нужен чтобы обновлять кадры, но он нам пригодится и для другого. Свойства следующие:
Active Only = False - По русски: "Быть активным всегда". Смысл: Работает даже если вы, работаете с другим приложением.
Interval = 0 - Частота повторения цикла должно быть равна 0.
TDXImageList - В этом листе будут у нас, хранится все спрайты. Свойства:
DXDraw = DXDraw1
После кликаем на Items… (TPictureCollection) появляется окно Editing DxImagelist1.Items .
В нём кликаем по Add New и в Object Inspector в поле "Name" пишем название спрайта.
Назовем его "pla" - это будет сам игрок, загружаем его с помощью Picture…
Игрок у меня будет вот такой:
Только фон чёрный для прозрачности. Устанавливаю в Object Inspector у данной картинки свойства Transparent = true и TransparentColor = clBlack.
Создаём ещё один спрайт под именем Pula проделываем тоже самое с ним только TransparentColor = clWhite . Выглядит пуля вот так:
И последнее что нам осталось добавить это боса, называем его "BOSS", вот он:
TransparentColor = clWhite на этом с DXImageList мы пока закончили.
TDXInput - Ну а этот компонент будет отвечать за нажатые клавиши на клавиатуре. В нем никакие изменения делать не будем.
Ну что теперь приступаем к написанию кода.
Вначале нужно изменить класс формы на TDXForm вот пример:
До:
……..
type
TForm1 = class(TForm)
DXDraw1: TDXDraw;
DXImageList1: TDXImageList;
DXInput1: TDXInput;
……
После:
……
type
TForm1 = class(TDXForm)
DXDraw1: TDXDraw;
DXImageList1: TDXImageList;
DXInput1: TDXInput
…….
Дальше расписываем классы после implementation. Вот так:
implementation
{$R *.DFM}
type
TPlayerSprite = class(TImageSprite) //Класс игрока
protected
procedure DoMove(MoveCount: Integer); override; // Движение
end;
TBoSS = 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;
TPlayerFa = 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;
Далее расписываем каждую процедуру для каждого класса.
Вот образец:
Procedure TPlayerFa.DoMove(MoveCount: Integer);
Begin
inherited DoMove(MoveCount);
end;
constructor TPlayerFa.Create(AParent: TSprite);
begin
end;
destructor TPlayerFa.Destroy;
begin
inherited Destroy; // Обязательно
end;
procedure TPlayerFa.DoCollision(Sprite: TSprite; var Done: Boolean);
begin
end;
Это нужно проделать с каждым классом содержащие свои процедуры указанные в классе.
Далее выбираем компонент DXTimer который уже на форме и в Object Inspector в закладке Events, находим пункт OnTimer. Два раза кликаем по пункту создаётся процедура
DXTimer1Timer в ней пишем следующие строчки:
if not DXDraw1.CanDraw then exit; // Если нет DirectX выходим
DXInput1.Update;
DXSpriteEngine1.Move(LagCount);
DXSpriteEngine1.Dead;
DXDraw1.Surface.Fill(0);
DXSpriteEngine1.Draw;
DXDraw1.Flip;
(продолжение следует)