Все ниже написанное относится к Delphi 5, в более старых версиях
возможны отличия, а может и нет, не знаю.
Щас мы будем анимировать
спрайт. Он будет состоять из 6 промежуточных фаз.
Я его выдрал из
Сеговской игрушки "Asterix & Obelix" (при помощи эмулятора), а Вы, если
обладаете талантом, можете его нарисовать, ну или тоже выдрать :). Должно
получиться что-то похожее на это:
Сначала сделаем без
использования DXSpriteEngine: Создадим форму MainForm На форме создадим DXDraw, размером где-то 150x150, DXImageList и DXTimer Красиво?
:), щас будет еще красивее. Теперь в Properties DXImageList'а делаем: DXDraw = DXDraw или как Вы там его обозвали. ВItems добавляем поочередно наши спрайтики в TPictureCollection, для каждого спрайта указывается
TransparentColor, в моем случае это $00FFC0C0 (вылез автоматически). Вооот,
теперь значицца в DXTimer Properties ставим: ActiveOnly = True Enabled = True Interval = 150, чем больше, значение,
тем больше задержка, между выводом картинок. В Events'ах DXTimer'a: OnTimer щелкаем
пару раз, создается процедура DXTimerTimer, вставляем
туда кусок:
const //Это перед Begin n:integer=0; //Это перед Begin
if not DXDraw.CanDraw then Exit; //Это понятно DXDraw.Surface.Fill(15); //Делаем поверхность синей (15) DXImageList.Items[n].Draw(DXDraw.Surface,50,50,0); //Здесь выводим спрайт № n на поверхность DXDraw в координаты 50х50 со значением Transparent=0 DXDraw.Flip; //Это переключит поверхности. if n > 5 then inc(n) else n:=0; //Здесь переключим счетчик на следующую картинку
Теперь давим Run и ОПА! Исходник и спрайты можете взять Здесь sampl1.zip (12Kb).
А
теперь тоже самое, но будем использовать DXSpriteEngine: Все
промежуточные фазы хранятся в одном файле:
Будем использовать первые 6
кадров. Так как все спрайты объединены в одной картинке, то необходимо
сделать
То есть установить ширину
и высоту кадра (при чем высота нужна только в случае 2-мерного массива
кадров)
type TSprite = class(TImageSprite) end;
procedure TForm1.FormCreate(Sender: TObject); Var Sprite:TImageSprite; begin Sprite := TSprite.Create(DXSpriteEngine.Engine); with TSprite(Sprite) do begin Image := DXImageList.Items.Find('sprite'); AnimStart:=0; AnimLooped:=true; AnimCount:=6; AnimSpeed:=100/1000; x:=100; y:=100; Z:=0; end; end;
procedure TForm1.DXTimerTimer(Sender: TObject; LagCount: Integer); begin DXSpriteEngine.Move(1); DXDraw.Surface.Fill(15); DXSpriteEngine.Draw; DXDraw.Flip; end;
|