Статья посвящена описанию процесса проектирования и разработки программы реализации движения фигуры на плоскости. В данном случае фигура будет — самолет, движение фигуры: взлет и выход на прямую траекторию от левой границы окна до правой с остановом при достижении правой границы. Движение и фигура должны отображаться в пользовательском окне.
Ключевые слова: программный код, пользовательское окно, C++, RGB, движение фигуры, белое перо.
Программа строится на основе мастера MFC AppWizard с форматом окна «Single document» на языке C++.
При создании приложений автоматически создается 4 основных класса:
– CKursovicApp — класс, производный от CWinApp;
– CMainFrame — класс, производный от CFrameView;
– CKursovicDoc — класс, производный от CDocument;
– CKursovicView — класс, производный от CView.
Класс CWinApp образует все прочие элементы приложения, данный класс получает все сообщения о событиях и затем направляет их классам CFrameView и CView.
Класс CFrameView — класс окна, образующий его рамку. Он содержит меню, панель инструментов, полосы прокрутки, а также многие другие видимые объекты, относящиеся к рамке окна. Данный класс определяет какая часть документа является видимой в каждый момент времени.
Класс CDocument содержит структуры, позволяющие хранить и манипулировать вводимыми в документ данными. Данный класс получает информацию, вводимую с помощью класса CView и посылает данному классу информацию для ее дальнейшего отображения. Кроме этого, класс CDocument ответственен за сохранение документа в файле и его считывания.
Класс CView отвечает за графическое представление документа пользователю. Данный класс передает введенную информацию классу CDocument, а также получает от него информацию для графического вывода. Большая часть создаваемого для этого класса дополнительного кода состоит из кода, позволяющего рисовать документ, показывая его пользователю, а также обрабатывать вводимую пользователем информацию.
В данной программе используется движение фигуры с ограничением движения по оси X и Y, поэтому диапазон движения ограничен:
– переменная x должна лежать в диапазоне от 0 до crect.Width (Изменяемая ширина пользовательского окна);
– переменная y должна лежать в диапазоне от 0 до crect.Height (Изменяемая высота пользовательского окна).
Основной код будет написан в классе CKursovicView. Составим общий алгоритм программы:
x1 и y1 — это координаты в пользовательском окне, относительно которых будет рисоваться самолет. Важно понимать, что координатная ось начинается в левом верхнем углу окна. То есть x1 это координата с левого края окна, прибавление ста пикселей необходимо, так как фигура рисуется вокруг этой координаты, то есть имеет ширину. y1 это четыре пятых высоты — низ окна.
Составим алгоритм главного метода, в котором будет происходить движение, myDraw():
Перейдем к коду.
void CKursovicView::myDraw(CDC* pDC) //Движение самолета
{
CKursovicDoc * pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: добавьте здесь код отрисовки для собственных данных
CRect crect;
CPen BlackPen, WhitePen;
GetWindowRect(&crect); //Получение ширины и высоты пользовательского окна
WhitePen.CreatePen(PS_SOLID, 100, RGB(255, 255, 255)); //создание белого пера
BlackPen.CreatePen(PS_SOLID, 5, RGB(0, 0, 0)); //создание черного пера
x1 = crect.Width() / crect.Width() + 100;
y1 = crect.Height() * 4 / 5;
pDC->SelectObject(&WhitePen); //выбор пера
Подготовительные работы завершены, осталось нарисовать фигуру и осуществить движение.
Для отрисовки создадим новый метод airplane(). Рисунок состоит из линий и нарисован относительно начальной координаты.
void CKursovicView::airplane(CDC* pDC) //Прорисовка самолета
{
pDC->MoveTo(x1 + 100, y1–100);
pDC->LineTo(x1–100, y1–100);
pDC->LineTo(x1–40, y1–40);
pDC->LineTo(x1–40, y1–20);
pDC->LineTo(x1–20, y1–20);
pDC->LineTo(x1, y1 + 60);
pDC->LineTo(x1 + 100, y1–100);
pDC->LineTo(x1–20, y1–20);
pDC->LineTo(x1 + 100, y1–100);
pDC->LineTo(x1–40, y1–20);
pDC->LineTo(x1 + 100, y1–100);
pDC->LineTo(x1–40, y1–40);
}
Теперь напишем код движения, для этого будем рисовать фигуру, затем стирать ее с помощью белого пера, а затем снова рисовать со сдвигом в несколько пикселей.
while (x1 < crect.Width() * 4 / 10) //разгон
{
pDC->SelectObject(&WhitePen);
pDC->Rectangle(x1–100, y1–100, x1 + 100, y1 + 100); //стирание уже нарисованного самолета
x1 += 7; //сдвиг на несколько пикселей
pDC->SelectObject(&BlackPen);
airplane(pDC);
Sleep(5); //миллисекундная задержка для наглядности движения
}
while (y1 > crect.Height() / 3) //взлет
{
pDC->SelectObject(&WhitePen);
pDC->Rectangle(x1–100, y1–100, x1 + 100, y1 + 100);
x1 += 5; y1 -= 5;
pDC->SelectObject(&BlackPen);
airplane(pDC);
Sleep(5);
}
while (x1 + 105 < crect.Width()) //движение по прямой
{
pDC->SelectObject(&WhitePen);
pDC->Rectangle(x1–100, y1–100, x1 + 100, y1 + 100);
x1 += 3;
pDC->SelectObject(&BlackPen);
airplane(pDC);
Sleep(5);
}
}
После компеляции данного когда, мы получим изображение самолета и его движение. На картинках показан самолет в трех основных положениях: разгон, взлет и полет.