§ 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, якое вылічаецца па формуле y = –0.3x + 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.