Первая анимация

Xakep, номер #044, стр. 044-060-1


Horrific aka Фленов Михаил smirnandr@mail.ru www.cydsoft.com/vr-online

Как я и обещал, сегодня мы создадим первую спрайтовую анимацию. Спрайты долгое время были основой в игровой графике, да и демомейкеры их не обходили стороной. Поэтому их понимание необходимо и обязательно для любого кодера компьютерной графики.

Теория

Спрайтовая анимация - это просто копия мультипликации. Как создается мультик? Сначала рисуется персонаж. Чтобы заставить его двигать рукой, нужно просто нарисовать много картинок, где рука персонажа будет медленно изменять свое положение. Теперь если быстро пролистать все картинки, то получается плавное движение рукой.

Компьютерная анимация похожа на мультипликацию. Посмотри на рисунок 1. На нем нарисован самолет, постепенно меняющий угол наклона. Если быстро пролистать каждый из кадров да еще и заставить кадры двигаться по оси Х, то получится ощущение, что самолет летит.

Именно таким способом создавались первые компьютерные игры. Ты думаешь, что в первом Doom монстры действительно были трехмерными? Нет, тогда мощности компьютеров на это не хватало. Просто дизайнеры подготовили большое количество картинок монстров в разных ракурсах, а программеры заставили нас поверить в трехмерность этих картинок. Ловкость рук и никакого обмана.

Преданимационный период

Итак, чтобы заставить нашу анимацию двигаться, нам понадобятся следующие дополнительные переменные:

X и Y - в этих переменных будет храниться текущее положение самолета.

State - состояние самолета. Я подготовил картинку из 7 положений самолета, и эта переменная будет указывать, какое именно положение сейчас должно отображаться.

LastXState - это для хранения времени, когда последний раз менялось состояние самолета. Так как самолет должен двигаться по оси Х (т.е. лететь слева направо), то здесь будет храниться Х позиция. Состояние будет меняться, когда он пролетит по оси Х на очередные 10 пикселей.

incparam - эту переменную я буду использовать для хранения значения приращения состояния самолета. Ну и сказанул. Короче, вначале здесь будет храниться 1. Когда надо изменить состояние, то я просто прибавляю это приращение к переменной State (State:=State+incparam). Это значит, что переменная State будет увеличиваться. Когда самолет получает состояние 7 (отображается 7 картинок), мне надо будет сделать так, чтобы переменная State стала уменьшаться, чтобы состояние самолета отражалось в обратном порядке. Для этого я меняю incparam на -1, и теперь State:=State+incparam будет уменьшать значение State.

К взлету готов

Загружай пример из предыдущего номера Х, сейчас мы его подкорректируем. Для начала надо приготовиться к взлету и всем новым переменным присвоить начальные значения. Для этого где-нибудь в начале старта приложения (лучше даже до кода, создающего окно) написать:

incparam:=1;

x:=0;

LastXState:=0;

y:=random(400);

Переменной Y я присваиваю значение функции random, которая возвращает случайное число в диапазоне от нуля до числа, переданного в качестве единственного параметра. Конечно же, высоту полета можно было бы задать и постоянным числом, но я решил сделать его случайным. Пускай самолет летает где хочет, лишь бы не разбился :).

Содержание  Вперед на стр. 044-060-2