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







 
  
 
 
 
 
 
 
  Дополнительно:
 Дополнительно:
 
  
  
 






