Анимация спрайтов
Оформил: XVeL
Автор: Daddy
WEB-сайт: http://daddy.mirgames.ru
Все ниже написанное относится к 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;
|