Динар Шакиров дата публикации 12-08-2004 11:47 Как рисовать спрайты в DXDraw DelphiX
- Для начала допустим, что у нас есть исходная форма Form1 типа TForm
- Внести в форму следующие компоненты из вкладки DelphiX
- DXSpriteEngine1 - спрайтовый движок DelphiX
- DXDraw1 - графический движок DelphiX
- DXImageList1 - будущая коллекция наших спрайтов
- DXTimer1 - таймер связанный с DXSpriteEngine1
- DXInput1 - слежение за мышью/джойстиком/клавиатурой
- Изменить тип исходной формы на TDXForm вместо TForm
- Внести в DXImageList1 необходимые нам рисунки спрайтов - для этого
нужно дважды кликнуть на компоненте и в открывшемся меню выбрать нужные
спрайты.
- Выставить в компоненте DXImageList1 в поле TDXDraw значение нашего
графического движка - DXDraw1, чтобы связать их.
- В методе OnCreate нашей формы создаём палитру из цветов выбранных из
наших спрайтов и заполняем соответствующие поля графического движка
DXDraw1 :
DXImageList1.Items.MakeColorTable;
DXDraw1.ColorTable := DXImageList1.Items.ColorTable;
DXDraw1.DefColorTable := DXImageList1.Items.ColorTable;
DXDraw1.UpdatePalette;
- Настраиваем разрешение и др. параметры графического движка DXDraw1 в
том же методе OnCreate нашей формы:
DXDraw1.Options := DXDraw1.Options + [doFullScreen];
DXDraw1.Width := 1024;
DXDraw1.Height := 768;
DXDraw1.Display.Width := 1024;
DXDraw1.Display.Height := 768;
DXDraw1.Display1.BitCount := 32;
DXForm1.BorderStyle := bsNone;
DXDraw1.Left := 0;
DXDraw1.Top := 0;
DXDraw1.Cursor := crNone;
DXDraw1.Initiate;
- Заполняем метод OnTimer компонента DXTimer1 (не забыть выставить поле
Interval этого компонента):
DXInput1.Update;
DXSpriteEngine1.DoMove (5);
DXSpriteEngine1.Dead;
DXDraw1.Surface.Fill(0);
DXSpriteEngine1.Draw;
DXDraw1.Flip;
После всего этого графический движок уже может нормально
функционировать - остаётся только создать и зарегистрировать наши спрайты
и их поведение в спрайтовом движке.
Существует несколько типов спрайтов, которые можно легко использовать в
приложении. Необходимо уяснить для себя какими свойствами обладает тот или
иной спрайт (как он движется) и ограничить себя необходимым типом:
- TSprite - простой неанимированный спрайт - может совершать лишь поступательные движения и неспособен менять свой рисунок.
- TImageSrite - простой анимированный спрайт - может совершать поступательные движения и пробегать при этом анимационный ряд (последний интуитивно устанавливается в компоненте DXImageList1).
- TImageSpriteEx - самый сложный из доступных - может совершать не только поступательные движения но и вращаться (разумеется в плоскости монитора) да ещё при этом пробегать анимационный ряд.
- TBackgroudSprite - фон - неанимирован фиксирован относительно спрайтового движка (хотя можно перемещаться относительно него - при этом он периодически повторяется в бесконечном пространстве)
Для создания спрайта необходимо описать его тип - его начальные данные и
поведение.
type
TMySprite = class (TImageSpriteEx);
constructor Create (AParent : TSprite) ; override;
procedure DoMove (movecount : Integer) ; override;
end;
Начальные данные задаются в конструкторе:
constructor TMySprite.Create(AParent : TSprite) ;
begin
inherited Create (AParent);
Image := DXForm1.DXImageList1.Items.Find ('мой спрайт.bmp');
Width := Image.Width;
Height := Image.Height;
X :=
Y :=
Z :=
AnimCount := Image.PatternCount;
AnimLooped :=
AnimPos :=
Tile := true
end;
Конечно же не обязательно описывать всё это в конструкторе - это можно
сделать и в runtime после создания спрайта. Сам объект спрайт в runtime
создаётся (и регистрируется) обычно, как и все другие объекты - нужно лишь
указать наш спрайтовый движок:
MySprite := TMySprite.Create (DXSpriteEngine1.Engine);
И теперь, в общих словах, о поведении спрайтов. Все те свойства,
которые были описаны в конструкторе разумеется можно менять. Поведение
каждого спрайта должно быть описано в его методе DoMove, который
впоследствии автоматически вызывается - когда мы вызываем метод нашего
движка DXSpriteEngine1.Move(5) - вызываются автоматически все методы
DoMove для всех зарегистрированных спрайтов (причём в данном случае ровно
5 раз). Описание поведения для отдельного спрайта будет выглядеть так:
procedure TMySprite.DoMove (movecount : Integer);
begin
inherited DoMove (movecount);
end;
И напоследок замечу, что можно менять и положение экрана относительно
фона - для этого существуют поля DXSpriteEngine1.Engine.X и DXSpriteEngine1.Engine.Y
соответственно.
Если нужна более полная информация или дополнительная - о механизме
столкновения и обработке событий клавиатуры через DXInput1 - по всему
этому обращайтесь тут же.
[DirectX, DirectShow etc.] [Анимация]
Обсуждение материала [ 16-04-2010 16:00 ] 1 сообщение |