Программирование с C++ Builder



Метод базовой точки



Следующая простая программа показывает, как можно заставить двигаться изображение, сформированное из графических примитивов. Окно и форма программы приведены на рис. 3.14.



Рис. 3.14. Окно и форма программы


На поверхности формы находится один-единственный компонент Timer, который используется для генерации последовательности событий, функция обработки которых обеспечивает вывод и удаление рисунка. Значок компонента Timer находится на вкладке System (рис. 3.15). Следует обратить внимание, что компонент Timer является невизуальным. Это значит, что во время работы программы компонент в диалоговом окне не отображается. Поэтому компонент Timer можно поместить в любую точку формы. Свойства компонента Timer приведены в табл. 3.7.



Рис. 3.15. Значок компонента Timer


Таблица 3.7. Свойства компонента Timer


Свойство

Определяет

Name

Имя компонента. Используется для доступа к свойствам компонента

Interval

Период возникновения события OnTimer, Задается в миллисекундах

Enabled

Разрешение работы. Разрешает (значение true) или запрещает (значение false) возникновение события OnTimer


Компонент Timer генерирует событие OnTimer. Период возникновения события onTimer измеряется в миллисекундах и определяется значением свойства interval. Следует обратить внимание на свойство Enabled. Оно дает возможность программе "запустить" или "остановить" таймер. Если значение свойства Enabled равно false, то событие onTimer не возникает.

В рассматриваемой программе вывод изображения выполняет функция ship, которая рисует на поверхности формы кораблик. В качестве параметров функция ship получает координаты базовой точки. Базовая точка (X0, Y0) определяет положение графического объекта в целом; от нее отсчитываются координаты графических примитивов, образующих объект (рис. 3.16). Координаты графических примитивов можно отсчитывать от базовой точки не в пикселах, а в относительных единицах. Такой подход позволяет легко выполнить масштабирование изображения.



Рис. 3.16. Базовая точка (х0, у0) определяет положение объекта


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