§ 17. Анимация

17.2. Простейшая анимация

Из курса информатики 8 класса вам известно, что выделяют два способа создания компьютерной анимации: покадровая и расчетная (пример 17.4).

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

Эффект движения объекта появлялся в результате быстрой смены кадров на экране.

Используя компонент таймер, можно создать простейшую анимацию в среде C++Builder. Для этого нужно:

  1. Нарисовать объект.
  2. Запустить таймер.
  3. Пока таймер работает:
    3.1. стереть объект;
    3.2. рассчитать новое положение объект;
    3.3. нарисовать объект.

Пример 17.5. Создать секундомер с движущейся секундной стрелкой.

Этапы выполнения задания

  1. Поместить на форму компоненты Timer, два компонента Image, и компонент Button.
  2. Изменить свойство Caption у компонента Button1 на «Пуск».
  3. Изменить свойство Enabled у компонента Timer1 на false.
  4. Задать размеры Image1 и Image2 такие как у рисунка с циферблатом. Компоненты разместить так, чтобы Image2 располагался точно над Image1.
  5. Изменить свойство Transparent у компонента Image2 на true.
  6. Написать обработчик событий OnCreate для формы, в котором:
    6.1. Загрузить изображение с циферблатом в Image1.
    6.2. На канве Image2 нарисовать стрелку, указывающую на 12.
  7. Написать обработчик события OnClick для компонента Button1, который будет запускать таймер.
  8. Написать обработчик событий OnTimer для компонента Timer, который будет стирать стрелку и прорисовывать ее в новом месте каждую секунду. Каждую секунду стрелка поворачивается на угол равный  

Пример 17.4. Способы создания компьютерной анимации:

 

Пример 17.5. Форма на этапе проектирования:

Переменные x, y, x_0, y_0 типа int и переменные ang и pi типа double описаны как глобальные.

Обработчик события OnClick для компонента Button1.

void __fastcall TForm1::
Button1Click(TObject *Sender)

{

  Timer1 ->Enabled = true;

}

 Обработчик события OnCreate для формы.

void __fastcall TForm1::FormCreate
               (TObject *Sender)

{

  Image1 -> Picture -> LoadFromFile
        
("stopwatch.bmp");

  x_0 = 123; y_0 = 181; ang = 0;

  //прямоугольник белого цвета, для того

  //чтобы прозрачным стал белый цвет

  Image2 -> Canvas -> Pen -> Color = clWhite;

  Image2 -> Canvas -> Rectangle

    (00, Image1 -> Width, Image1 -> Height);

  //стрелка длиной 75 пикселей 

  //в начальном положении

  x = x_0; y = y_0 - 75;

  Image2 -> Canvas -> Pen-> Color = clBlack;

  Image2 -> Canvas -> Pen -> Width = 2;

  Image2 -> Canvas -> MoveTo(x_0, y_0);

  Image2 -> Canvas -> LineTo(x, y);

  pi = acos(-1.);

}

 Обработчик события OnTimer для таймера.

void __fastcall TForm1::Timer1Timer
                (TObject *Sender)

{

  //стирание стрелки белым цветом

  Image2 -> Canvas -> Pen -> Color = clWhite;

  Image2 -> Canvas -> Pen -> Width = 3;

  Image2 -> Canvas -> MoveTo(x_0, y_0);

  Image2 -> Canvas -> LineTo(x, y);

  //вычисление координат конца стрелки

  ang = ang + pi / 30;

  x = x_0 + ceil(75 * sin(ang));

  y = y_0 - ceil(75 * cos(ang));

  //рисование стрелки в новом положении

  Image2 -> Canvas -> Pen -> Color = clBlack;

  Image2 -> Canvas -> Pen -> Width = 2;

  Image2 -> Canvas -> MoveTo(x_0, y_0);

  Image2 -> Canvas -> LineTo(x, y);

}

 Работающее приложение: