Версия для печати


Как рисовать спрайты в DXDraw DelphiX
http://www.delphikingdom.com/asp/viewitem.asp?catalogID=1031

Динар Шакиров
дата публикации 12-08-2004 11:47

Как рисовать спрайты в DXDraw DelphiXПодготовка к использованию:

  1. Для начала допустим, что у нас есть исходная форма Form1 типа TForm
  2. Внести в форму следующие компоненты из вкладки DelphiX
    • DXSpriteEngine1 - спрайтовый движок DelphiX
    • DXDraw1 - графический движок DelphiX
    • DXImageList1 - будущая коллекция наших спрайтов
    • DXTimer1 - таймер связанный с DXSpriteEngine1
    • DXInput1 - слежение за мышью/джойстиком/клавиатурой
  3. Изменить тип исходной формы на TDXForm вместо TForm
  4. Внести в DXImageList1 необходимые нам рисунки спрайтов - для этого нужно дважды кликнуть на компоненте и в открывшемся меню выбрать нужные спрайты.
  5. Выставить в компоненте DXImageList1 в поле TDXDraw значение нашего графического движка - DXDraw1, чтобы связать их.
  6. В методе OnCreate нашей формы создаём палитру из цветов выбранных из наших спрайтов и заполняем соответствующие поля графического движка DXDraw1 :
          DXImageList1.Items.MakeColorTable;
          DXDraw1.ColorTable := DXImageList1.Items.ColorTable;
          DXDraw1.DefColorTable := DXImageList1.Items.ColorTable;
          DXDraw1.UpdatePalette;
  7. Настраиваем разрешение и др. параметры графического движка 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;
    
  8. Заполняем метод OnTimer компонента DXTimer1 (не забыть выставить поле Interval этого компонента):
    // регулярное обновление событий клавиатуры/мыши
          DXInput1.Update;
    	  //смещаем все спрайты в целом на 5 шагов
          //(правила смещения отдельного спрайта описываются позже в самом спрайте).
          DXSpriteEngine1.DoMove (5);
    	  //замораживаем спрайтовый движок;
          DXSpriteEngine1.Dead;
    	  //очистка экрана (очень быстрая)
          DXDraw1.Surface.Fill(0);
    	  //прорисовываем все спрайты (пока только в памяти)
          DXSpriteEngine1.Draw;
    	  //отображаем всё что получилось на экран
          DXDraw1.Flip;
    

После всего этого графический движок уже может нормально функционировать - остаётся только создать и зарегистрировать наши спрайты и их поведение в спрайтовом движке.

Создание фона и спрайтов:

Существует несколько типов спрайтов, которые можно легко использовать в приложении. Необходимо уяснить для себя какими свойствами обладает тот или иной спрайт (как он движется) и ограничить себя необходимым типом:

  1. TSprite - простой неанимированный спрайт - может совершать лишь поступательные движения и неспособен менять свой рисунок.
  2. TImageSrite - простой анимированный спрайт - может совершать поступательные движения и пробегать при этом анимационный ряд (последний интуитивно устанавливается в компоненте DXImageList1).
  3. TImageSpriteEx - самый сложный из доступных - может совершать не только поступательные движения но и вращаться (разумеется в плоскости монитора) да ещё при этом пробегать анимационный ряд.
  4. 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 - по всему этому обращайтесь тут же.