Иллюстрированный самоучитель по C++ Builder

Мультипликация. Метод базовой точки.

Перед тем как нарисовать кораблик на новом месте, функция обработки события от таймера стирает кораблик, нарисованный в процессе обработки предыдущего события onTimer. Изображение кораблика стирается путем вывода прямоугольника, перекрывающего его.

Функции обработки события OnTimer, функция Ship и функция FormCreate, обеспечивающая настройку таймера, приведены в листинге 3.6.

Листинг 3.6. Простая мультипликация.

int х = -68, у = 50; // начальное положение базовой точки
// рисует на поверхности формы кораблик
void __fastcall TForml::Ship(int x, int y)
 {
int dx=4,dy=4; // шаг сетки
// корпус и надстройку будем рисовать
// при помощи метода Polygon
TPoint pi[7]; // координаты точек корпуса
TPoint p2[8]; // координаты точек надстройки
TColor pc,bc; // текущий цвет карандаша и кисти
// сохраним текущий цвет карандаша и кисти
рс = Canvas › Pen › Color;
be = Canvas › Brush › Color;
// установим нужный цвет карандаша и кисти
Canvas › Pen › Color = clBlack;
Canvas › Brush › Color = clWhite;
// рисуем… 11 корпус
pl[0].x = x; pl[0].y = y;
pl[l].x = x; pl[l].y = y-2*dy;
pl[2].x = x+10*dx; pi[2].у = y-2*dy;
pl[3].x = x+ll*dx; pl[3].y = y-3*dy;
pl[4]-x = x+17*dx; pi[4].у =y-3*dy;
pl[5].x = x+14*dx; pi[5].у =y;
pl[6].x = x; pl[6].y =y;
Canvas › Polygon(pl,6);
// надстройка
p2[0].x = x+3*dx; p2[0].y = y-2*dy;
p2[l].x = x+4*dx; p2[l].y = y-3*dy;
р2[2].х = x+4*dx; p2[2].y = y-4*dy;
р2[3].х = x+13*dx; p2[3].y = y-4*dy;
р2[4].х = x+13*dx; p2[4].y = y-3*dy;
р2[5].х = x+ll*dx; p2[5].y = y-3*dy;
р2[6].х = x+10*dx; p2[6].y = y-2*dy;
р2[7].х = x+3*dx; p2[7].y = y-2*dy;
Canvas › Polygon(p2.7);
Canvas › MoveTo(x+5*dx,y-3*dy);
Canvas › LineTo(x+9*dx,y-3*dy);
// капитанский мостик
Canvas › Rectangle(x+8*dx,y-4*dy,x+ll*dx,y-5*dy);
// труба
Canvas › Rectangle(x+7*dx,y-4*dy,x+8*dx,y-7*dy);
// иллюминаторы
Canvas › Ellipse(x+ll*dx,y-2*dy,x+12*dx,y-l*dy);
Canvas › Ellipse(x+13*dx,y-2*dy,x+14*dx,y-l*dy);
// мачта
Canvas › MoveTo(x+10*dx,y-5*dy);
Canvas › LineTo(x+10*dx,y-10*dy);
// оснастка
Canvas › Pen › Color = clWhite;
Canvas › MoveTo(x+17*dx,y-3*dy);
Canvas › LineTo(x+10*dx, y-10*dy);
Canvas › LineTo(x,y-2*dy);
// восстановим цвет карандаша и кисти
Canvas › Pen › Color = рс;
Canvas › Brush › Color = be; }
// обработка события OnTimer
void__fastcall TForml::TimerlTimer(TObject *Sender)
{
// стереть кораблик – закрасить цветом, совпадающим
// с цветом фона (формы)
Canvas › Brush › Color = Forml › Color;
Canvas › FillRect(Rect(x-1,y+l,x+68,y-40));
// вычислить координаты базовой точки х+=3;
if (x > ClientWidth)
{
// кораблик "уплыл" за правую границу формы
х= -70; // чтобы кораблик "выплывал" из-за левой границы формы
y=random(Forml › ClientHeight); }
// нарисовать кораблик на новом месте Ship(х, у);)
// обработка события OnCreate для формы
void__fastcall TForml::FormCreate(TObject *Sender)
{
/* Таймер можно настроить во время разработки программы
(в процессе создания формы) или во время работы программы. */
// настройка и запуск таймера
Timerl › Interval = 100; // период события OnTimer – 0.1 сек.
Timerl › Enabled = true; // пуск таймера
}
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.