§ 17. Анимация

17.3. Анимация движения

Для создания анимации движения достаточно загрузить изображение в Image и для каждого срабатывания таймера менять координаты верхнего левого угла компонента. Для того чтобы объект двигался горизонтально, достаточно менять только значение координаты х. Для организации движения по более сложным траекториям необходимо вычислять значения координат по формулам. Зависимости могут быть функциональными (значение y зависит от значения х) или параметрическим (значения как x, так и y зависят от значений параметра t).

Пример 17.6. Создать проект, в котором самолет будет пролетать над городом. При удалении самолет должен уменьшаться.

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

  1. Поместить на форму два компонента Image, компоненты Timer и Button.
  2. Изменить свойства Caption у компонента Button1 на «Полетели!».
  3. Установить у компонента Image2 значение true для свойств Transparent и AutoSize.
  4. Установить значение false у свойства таймера Enabled.
  5. Установить в инспекторе объектов время срабатывания таймера равным 10.
  6. Написать обработчик события OnCreate для формы, в котором:
    6.1. Загрузить из файла изображение города в компонент Image1.
    6.2. Загрузить из файла изображение самолета в Image2.
    6.3. Описать начальное положение самолета, указав координаты верхнего левого угла Image2 за пределами формы.
  7. Написать обработчик события OnClick для компонента Button1, в котором запустить таймер.
  8. Написать обработчик события OnTimer, в котором необходимо изменить значение свойств компонента Image2.
    8.1. Значение свойств Left и Top. Значение Left — это величина координаты по x, которое меняется на 1 при каждом срабатывании таймера. Значение Top — это величина координаты по y, которое вычисляется по формуле = –0.3+ 200. Если самолет вылетел за границу, то вернуть его в начальное положение.

    8.2. Значение свойств Width и Height изменяется на 3 и 1 соответственно (ширина рисунка с самолетом примерно в 3 раза больше, чем высота). Изменения происходят для каждого x, которое кратно 30.

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

Переменные x_plane, y_plane, w, h типа int описаны как глобальные.

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

void __fastcall TForm1::
Button1Click(TObject *Sender)

{

  Timer1 ->Enabled = true;

}

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

void __fastcall TForm1::
FormCreate(TObject *Sender)

{

  Image1 -> Picture ->

    LoadFromFile("city.bmp");

  Image2 -> Picture ->

    LoadFromFile("plane.bmp");

  w = Image2 -> Width;

  h = Image2 -> Height;

  x_plane = -w;

  Image2 -> Left = x_plane;

  Image2 -> Top = y_plane;

  //изменение свойств для того,

  //чтобы можно было менять размер

  Image2 -> AutoSize = false;

  Image2 -> Stretch = true;

}

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

void __fastcall TForm1::
Timer1Timer(TObject *Sender)

{

  //изменение координты x

  x_plane ++;

  if (x_plane > Image1 -> Width)

    x_plane = -w;

  //изменение координты y

  y_plane = -0.3 * x_plane + 200;

  //изменение размера

  if (x_plane % 30 == 0){

    Image2 -> Width -= 3;

    Image2 -> Height -= 1;

  }

  //вывод рисунка в новой позиции

  Image2 -> Left = x_plane;

  Image2 -> Top = y_plane;

}

Работающее приложение (в разные моменты времени):

Если при работе приложения возникает мерцание, то необходимо установить значение true для свойств формы AlphaBlend и DoubleBuffered.