Політ у хмарах

У проекті використовується тільки компонент Timer. Програма Літачок демонструє принципи мультиплікації (рух об’єкта на тлі картинки). Зображення фону й об’єкта завантажуються з файлу. Черговий кадр формується в пам’яті (на поверхні невидимого бітового образу), а потім виводиться на поверхню форми з деяким зміщенням щодо попереднього положення.

Код написання програми

#include vcl.h
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int x, y;
Graphics::TBitmap *back = new Graphics::TBitmap();
Graphics::TBitmap *sprite = new Graphics::TBitmap();
Graphics::TBitmap *kadr = new Graphics::TBitmap();
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
// завантажити фоновий малюнок із bmp-файлу
back->LoadFromFile("sky.bmp");
// встановити розмір клієнтської (робочої) області форми відповідно до розміру фонового малюнка
ClientWidth = back->Width;
ClientHeight = back->Height;
// завантажити картинку
sprite->LoadFromFile("plane.bmp");
sprite->Transparent = true;
// сформувати кадр
kadr->LoadFromFile("plane.bmp");
// вихідне положення літака
x = -sprite->Width; // початкове положення літака за межами вікна
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);
// стерти літак (відновити "зіпсований" фон)
Canvas->CopyRect(badRect, back->Canvas, badRect);
// обчислити нові координати спрайта
x += 1;
if (x > ClientWidth)
{
// літак полетів за праву межу форми
// змінити висоту і швидкість польоту
x = -sprite->Width; // початкове положення літака за межами вікна
y = random(ClientHeight - sprite->Height);
Timer1->Interval = random(20) + 10; // швидкість польоту від 10 до 29
}
// намалювати літак
Canvas->Draw(x, y, sprite);
}
void __fastcall TForm1::FormPaint(TObject *Sender)
{
// відновити фоновий малюнок
Canvas->Draw(0,0,back); // фон
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *