Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
отчет мой.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
4.46 Mб
Скачать

Задача 30. Полет в облаках

Программа Полет в облаках (Рис. 37) демонстрирует принципы мультипликации (движение объекта на фоне картинки)

Рис 37

Вывод: В этом задании мы научились создавать анимацию движения самолёта с помощью кода и компонента Timer.

Листинг

#include <vcl.h>

#pragma hdrstop

#include "Unit1.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

Graphics::TBitmap *back;

Graphics::TBitmap *sprite;

Graphics::TBitmap *kadr;

int x,y;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

back = new Graphics::TBitmap();

back->LoadFromFile("C:\\Полет в облаках\\123.bmp");

// установить размер клиентской (рабочей) области формы

// в соответствии с размером фонового рисунка

ClientWidth = back->Width;

ClientHeight = back->Height;

// загрузитькартинку

sprite = new Graphics::TBitmap();

sprite->LoadFromFile("imgpreview.bmp");

sprite->Transparent = true;

// сформироватькадр

kadr = new Graphics::TBitmap();

kadr->LoadFromFile("imgpreview.bmp");

// исходное положение самолета

x = -40; // чтоб самолет "вылетал" из-за левой границы окна

y = 20;

Timer1->Interval = 10;

Timer1->Enabled = true;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Timer1Timer(TObject *Sender)

{

TRect badRect; // положение и размер области фона,

// которую надо восстановить

TRect frameRect ;

badRect = Rect(x,y,x+sprite->Width,y+sprite->Height);

frameRect = Rect(0,0, kadr->Width, kadr->Height);

#ifdef ONCANVAS

Canvas->CopyRect(badRect,back->Canvas,badRect);

// вычислим новые координаты спрайта

x +=2;

if (x > ClientWidth)

{

// самолет улетел за правую границу формы

// изменим высоту и скорость полета

x = -20;

y = random(ClientHeight - 30); // высота полета

// скорость полета определяется периодом возникновения

//события OnTimer, который, в свою очередь, зависит

// от значения свойства Interval

Timer1->Interval = random(20) + 10; // скорость

// "полета" от 10 до 29

}

Canvas->Draw(x,y,sprite);

#else

// изображение формируем на рабочей поверхности,

// затем выводим на поверхность формы

// сформировать очередной кадр

// скопироватьфрагментфона

kadr->Canvas->CopyRect(frameRect, back->Canvas,badRect);

// нарисоватьобъект

kadr->Canvas->Draw(0,0,sprite);

Form1->Canvas->Draw(x,y,kadr);

// вычислим новые координаты спрайта

x += 1;

if (x > ClientWidth)

// самолет улетел за правую границу формы

// изменим высоту и скорость полета

x = -20;

y = random(ClientHeight - 30); // высота полета

// скорость полета определяется периодом возникновения

// события OnTimer, который, в свою очередь, зависит

// от значения свойства Interval

Timer1->Interval = random(20) + 10; // скорость

// "полета" от 10 до 29

#endif

}

//---------------------------------------------------------------------------

void __fastcall TForm1::FormPaint(TObject *Sender)

{

Canvas->Draw(0,0,back);

}