Главная » Статьи » Программирование » Delphi, Pascal, ObjectPascal » Как рисовать спрайты в DXDraw DelphiX
|
Как рисовать спрайты в 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 - по всему этому обращайтесь тут же.
Категория: Delphi, Pascal, ObjectPascal |
Просмотров: 5778 |
Добавил: ДядяВолк (11.08.2010)
| Рейтинг: 0.0/0
Теги: Источник: http://quadrathell.cn.ua/ | |
HTML ссылка на материал: BB ссылка на материал: |
Всего комментариев: 0 | |