Мультипликация. Метод базовой точки.
Перед тем как нарисовать кораблик на новом месте, функция обработки события от таймера стирает кораблик, нарисованный в процессе обработки предыдущего события 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; // пуск таймера }