Версия для печати
Как рисовать спрайты в DXDraw DelphiX
http://www.delphikingdom.com/asp/viewitem.asp?catalogID=1031Динар Шакиров
дата публикации 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; //смещаем все спрайты в целом на 5 шагов //(правила смещения отдельного спрайта описываются позже в самом спрайте). 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); //задаём картинку или анимационный ряд нашего спрайта - берём их из //коллекции рисунков DXImageList1 Image := DXForm1.DXImageList1.Items.Find ('мой спрайт.bmp'); Width := Image.Width; //указываем размеры спрайта как у его рисунка. Height := Image.Height; //координата X нашего спрайта; X := //координата Y нашего спрайта; Y := //глубина на которой спрайт находится - если Z спрайта больше, //чем у других - он всех будет крыть. Z := //Только для анимированных спрайтов: //указывает сколько рисунков в анимационном ряду. AnimCount := Image.PatternCount; AnimLooped := //true - если ряд зациклен, false - если нет AnimPos := //начальный рисунок в анимационном ряду. //Только для вращающихся спрайтов //Angle - угол поворота спрайта - 0 вверх, 64 вправо, 128 вниз, //192 - влево, 256 - вверх и так далее. //Только для фона: //если неоходимо периодически заполнить всё //пространство одним рисунком, false - если нет такой необходимости. 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); //а здесь задаём поведение(меняем координаты- X,Y,Z, угол //поворота - Angle , рисунок в анимационном ряду - AnimPos и т.п.) end;И напоследок замечу, что можно менять и положение экрана относительно фона - для этого существуют поля DXSpriteEngine1.Engine.X и DXSpriteEngine1.Engine.Y соответственно.
Если нужна более полная информация или дополнительная - о механизме столкновения и обработке событий клавиатуры через DXInput1 - по всему этому обращайтесь тут же.