364_____________________________________________Глава 5

ном, но относится не к фону, а к рисунку. Рисование очередного кадра производит-
ся не сразу на холсте, который видит пользователь, а на канве невидимого компо-
нента, типа того Bitmap, с которым вы только что работали. А после того, как ри-
сунок сделан, он переносится на видимый холст методами Draw или CopyRect. Эти
методы работают очень быстро и никаких неприятных мерцаний не происходит.

Еще одна проблема анимации — определение того, какие элементы изобража-
емого объекта видны, а какие — нет. Несмотря на простоту нашего примера с че-
ловечком, даже в нем возникла такая проблема, но мы ею пренебрегли, чтобы не
усложнять код. Если вы внимательно посмотрите на рис. 5.15 или 5.16, то увиди-
те, что изображение неправильное. Конец одной из рук должен быть скрыт за ли-
таврами, которые держит человечек. Эту ошибку в данном случае не трудно было
бы убрать, но код несколько усложнился бы. А вот в трехмерной графике при вра-
щении изображения объекта подобная проблема встает очень остро и должна соот-
ветствующим образом решаться.

Последний вопрос, который мы рассмотрим, — как сделать нашу мультипли-
кацию более плавной. Если вы не стремитесь к лаврам Диснея, вам достаточно
ограничиться в ваших мультипликациях простыми механическими движениями,
которые всегда можно описать соответствующими функциями. Это относится к
любым динамическим иллюстрациям работы механизмов, к любым схематиче-
ским перемещениям. Можно применить функциональное описание движения и к
нашему человечку. Вполне допустимо считать, что его руки и ноги движутся по
окружностям с соответствующими центрами. Тогда легко рассчитать их положе-
ние в любой момент времени и соответственно разбить это движение на любое чис-
ло кадров.

Давайте сделаем движения нашего человечка более плавными. Откройте
опять ваше первое приложение с анимацией и опять сохраните модуль и сам про-
ект под новыми именами. Вы можете ничего не добавлять на форму, а только изме-
нить тексты процедур. Теперь эти тексты должны иметь следующий вид.

^define Pi 3.1415926535897932385

short int cadr = 0;           // номер кадра

short int H=30;               // длина ноги и руки

short int Xpos = 3 * H;       // координата опорной ноги

short int Ypos = 120;         // "земля"

short int Hmen = 30;          // высота тела

short int Rhead = 10;         // радиус головы

short int revers =1;         // направление движения

short int L = H * 1.41;       // длина ноги

short int Ncadr=16;           // число кадров на шаг

//———————————————————————-

void _fastcall TFormI::Draw()
(

float Angi = Pi/4*(1+(2.*cadr)/(Ncadr-1));

short int Yb = Ypos-H*sin(Angi);

short int Yt = Yb-Hmen;