Слайд 1Основы программирования
(ИВТ)
ФИСТ 1 курс
Власенко
Олег
Федосович
Лекция 5
Использование массивов в графике.
Делаем
простую игру с массивом.
Слайд 2Polygon
POINT pt[5];
pt[0].x = 100;
pt[0].y = 50;
pt[1].x = 150;
pt[1].y = 100;
pt[2].x
= 150;
pt[2].y = 150;
pt[3].x = 50;
pt[3].y = 150;
pt[4].x = 50;
pt[4].y
= 100;
Polygon(hdc, pt, 5);
Слайд 3Polygon
POINT pt[5];
pt[0].x = 100;
pt[0].y = 50;
pt[1].x = 150;
pt[1].y = 100;
pt[2].x
= 150;
pt[2].y = 150;
pt[3].x = 50;
pt[3].y = 150;
pt[4].x = 50;
pt[4].y
= 100;
Polygon(hdc, pt, 4);
Слайд 4Polygon
POINT pt[5];
pt[0].x = 100;
pt[0].y = 50;
pt[1].x = 150;
pt[1].y = 100;
pt[2].x
= 150;
pt[2].y = 150;
pt[3].x = 50;
pt[3].y = 150;
pt[4].x = 50;
pt[4].y
= 100;
Polygon(hdc, pt, 3);
Слайд 5Polygon
HBRUSH hBrush = CreateHatchBrush(HS_CROSS, RGB(128, 0, 128));
SelectObject(hdc, hBrush);
Ellipse(hdc, 0, 0
, 160, 120);
HBRUSH hBrush2 = CreateHatchBrush(HS_DIAGCROSS, RGB(128, 0, 128));
SelectObject(hdc, hBrush2);
POINT
pt[5];
pt[0].x = 100;
pt[0].y = 50;
pt[1].x = 150;
pt[1].y = 100;
pt[2].x = 150;
pt[2].y = 150;
pt[3].x = 50;
pt[3].y = 150;
pt[4].x = 50;
pt[4].y = 100;
Polygon(hdc, pt, 5);
Слайд 6Polygon – прозрачная кисть
HBRUSH hBrush = CreateHatchBrush(HS_CROSS, RGB(128, 0, 128));
SelectObject(hdc,
hBrush);
Ellipse(hdc, 0, 0 , 160, 120);
SelectObject(hdc, GetStockObject(NULL_BRUSH));
POINT pt[5];
pt[0].x = 100;
pt[0].y
= 50;
pt[1].x = 150;
pt[1].y = 100;
pt[2].x = 150;
pt[2].y = 150;
pt[3].x = 50;
pt[3].y = 150;
pt[4].x = 50;
pt[4].y = 100;
Polygon(hdc, pt, 5);
Слайд 7Polyline
POINT pt[5];
pt[0].x = 100;
pt[0].y = 50;
pt[1].x = 150;
pt[1].y = 100;
pt[2].x
= 150;
pt[2].y = 150;
pt[3].x = 50;
pt[3].y = 150;
pt[4].x = 50;
pt[4].y
= 100;
Polyline(hdc, pt, 5);
Слайд 8Источники информации
http://www.frolov-lib.ru/books/bsp/v14/ch2_3.htm - Рисование геометрических фигур
Слайд 9Делаем игру «Меткий зенитчик»
Слайд 10Константы и подключаемые файлы
// Lection6_1.cpp: определяет точку входа для
приложения.
//
#include "stdafx.h"
#include "Lection6_1.h"
#define _USE_MATH_DEFINES
#include
#define MAX_LOADSTRING 100
// Глобальные переменные:
HINSTANCE hInst;
WCHAR szTitle[MAX_LOADSTRING];
WCHAR szWindowClass[MAX_LOADSTRING];
Слайд 11Функция WndProc (1)
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam,
LPARAM lParam)
{
switch (message)
{
…
case WM_CREATE:
SetTimer(hWnd, 1, 100, 0);
break;
case WM_TIMER:
CheckContact();
MovePlane();
MoveBullet();
InvalidateRect(hWnd, NULL, TRUE);
break;
Слайд 12Функция WndProc (2)
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
// TODO:
Добавьте сюда любой код …
DrawPlane(hdc);
DrawCannon(hdc);
DrawBullet(hdc);
EndPaint(hWnd, &ps);
}
break;
Слайд 13Функция WndProc (3)
case WM_KEYDOWN:
switch (wParam)
{
case VK_LEFT:
MoveCannonLeft();
InvalidateRect(hWnd, NULL, TRUE);
break;
case VK_RIGHT:
MoveCannonRight();
InvalidateRect(hWnd, NULL,
TRUE);
break;
case VK_RETURN:
ShotCannon();
InvalidateRect(hWnd, NULL, TRUE);
break;
}
break;
…
Слайд 14Модель (глобальные данные) (1)
// Глобальные переменные:
…
// самолет-мишень
int plane_x = 0;
int
plane_y = 100;
int plane_vx = 10;
int plane_vy = 0;
//int plane_state
= 1; // 1 - in flight, 2 - destroyed
enum State {
IN_STOCK,
IN_FLIGHT,
DESTROYED
};
State plane_state = IN_FLIGHT;
Слайд 15Модель (глобальные данные) (2)
// пуля
int bullet_x = 430;
int bullet_y =
445;
int bullet_vx = 0;
int bullet_vy = 0;
//int state = 0;
// 0 - in stock, 1 - in flight, 2 - destroyed
State bullet_state = IN_STOCK;
Слайд 16Модель (глобальные данные) (3)
// зенитное орудие
double alpha = M_PI *
3.0 / 2.0; // направление стрельбы - СТРОГО ВВЕРХ
Слайд 17Зенитное орудие - отрисовка
void DrawCannon(HDC hdc) {
HPEN hPen = CreatePen(PS_SOLID,
3, RGB(0, 0, 255));
SelectObject(hdc, hPen);
MoveToEx(hdc, 400, 450, NULL);
LineTo(hdc, 600, 450);
Arc(hdc,
450, 400,550, 500, 550,450, 450, 450);
int r1 = 50;
int r2 = 70;
int x1 = 500 + (int)(cos(alpha) * r1);
int x2 = 500 + (int)(cos(alpha) * r2);
int y1 = 450 + (int)(sin(alpha) * r1);
int y2 = 450 + (int)(sin(alpha) * r2);
MoveToEx(hdc, x1, y1, NULL);
LineTo(hdc, x2, y2);
}
Слайд 18Зенитное орудие - управление
void MoveCannonRight() {
if (alpha < M_PI *
1.95)
alpha += M_PI / 20;
}
void MoveCannonLeft() {
if (alpha > M_PI
* 1.05)
alpha -= M_PI / 20;
}
Слайд 19Зенитное орудие - выстрел
void ShotCannon() {
if (bullet_state != IN_STOCK)
return;
int r2
= 70;
int x2 = 500 + (int)(cos(alpha) * r2);
int y2
= 450 + (int)(sin(alpha) * r2);
int vr = 10;
int vx = (int)(cos(alpha) * vr);
int vy = (int)(sin(alpha) * vr);
bullet_x = x2;
bullet_y = y2;
bullet_vx = vx;
bullet_vy = vy;
bullet_state = IN_FLIGHT;
}
Слайд 20Самолет - отрисовка
void DrawPlane(HDC hdc) {
HPEN hPen = NULL;
if (plane_state
== IN_FLIGHT)
hPen = CreatePen(PS_SOLID, 10, RGB(255, 0, 0));
if (plane_state ==
DESTROYED)
hPen = CreatePen(PS_SOLID, 10, RGB(255, 255, 0));
SelectObject(hdc, hPen);
MoveToEx(hdc, plane_x + 50, plane_y, NULL);
LineTo(hdc, plane_x - 50, plane_y);
LineTo(hdc, plane_x - 70, plane_y - 20);
MoveToEx(hdc, plane_x - 50, plane_y + 30, NULL);
LineTo(hdc, plane_x, plane_y);
LineTo(hdc, plane_x - 50, plane_y - 30);
}
Слайд 21Самолет – проверка попадания в
int InsidePlane(int plane_x, int plane_y, int
x, int y) {
if (x < plane_x - 50)
return 0;
if
(x > plane_x + 50)
return 0;
if (y < plane_y - 20)
return 0;
if (y > plane_y + 20)
return 0;
return 1;
}
Слайд 22Самолет – перемещение и уничтожение
void MovePlane() {
plane_x += plane_vx;
plane_y +=
plane_vy;
}
void DestroyPlane() {
plane_state = DESTROYED;
}
Слайд 23Пуля – отрисовка, перемещение и уничтожение
void DrawBullet(HDC hdc) {
if (bullet_state
== DESTROYED)
return;
HPEN hPen = CreatePen(PS_SOLID, 3, RGB(0, 255, 0));
SelectObject(hdc, hPen);
Ellipse(hdc,
bullet_x - 3, bullet_y - 3, bullet_x + 3, bullet_y + 3);
}
void MoveBullet() {
bullet_x += bullet_vx;
bullet_y += bullet_vy;
}
void DestroyABullet() {
bullet_state = DESTROYED;
}
Слайд 24Пуля – проверка контакта пули и самолета
void CheckContact() {
if (bullet_state
== IN_FLIGHT
&& InsidePlane(plane_x, plane_y, bullet_x, bullet_y)) {
DestroyPlane();
DestroyABullet();
}
}
Слайд 25Демонстрация сборки проекта из кода презентации
Слайд 27А если окно не того размерчика?
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
hInst = hInstance; // Сохранить маркер экземпляра в глобальной
переменной
HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
Слайд 28А если окно не того размерчика?
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
hInst = hInstance; // Сохранить маркер экземпляра в глобальной
переменной
HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, 1200, 550, nullptr, nullptr, hInstance, nullptr);
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
Слайд 30Версия 2.0: Стреляем очередями
Что нужно изменить в программе, чтобы пуль
было несколько?
Как сделать, чтобы каждая пуля летела независимо от других?
Слайд 31Модель (данные) (1)
// Глобальные переменные:
…
// самолет-мишень
int plane_x = 0;
int plane_y
= 100;
int plane_vx = 10;
int plane_vy = 0;
//int plane_state =
1; // 1 - in flight, 2 - destroyed
enum State {
IN_STOCK,
IN_FLIGHT,
DESTROYED
};
State plane_state = IN_FLIGHT;
Слайд 32Модель (данные) (2)
// пуля
#define NUM_BULLET 8
int cnt_bullet = 0;
int bullet_x[NUM_BULLET]
= { 430, 430, 430, 430, 440, 440, 440,
440 };
int bullet_y[NUM_BULLET] = { 430, 435, 440, 445, 430, 435, 440, 445 };
int bullet_vx[NUM_BULLET] = {0, 0, 0, 0, 0, 0, 0, 0};
int bullet_vy[NUM_BULLET] = {0, 0, 0, 0, 0, 0, 0, 0};
//int state = 0; // 0 - in stock, 1 - in flight, 2 - destroyed
State bullet_state[NUM_BULLET] = {
IN_STOCK, IN_STOCK, IN_STOCK, IN_STOCK,
IN_STOCK, IN_STOCK, IN_STOCK, IN_STOCK
};
Слайд 33Модель (данные) (3)
// зенитное орудие
double alpha = M_PI * 3.0
/ 2.0; // направление стрельбы - СТРОГО ВВЕРХ
Слайд 34Много пуль: Отрисовка
void DrawBullet(HDC hdc) {
HPEN hPen = CreatePen(PS_SOLID, 3,
RGB(0, 255, 0));
SelectObject(hdc, hPen);
int i = 0;
while (i < NUM_BULLET)
{
if (bullet_state[i] != DESTROYED) {
Ellipse(hdc,
bullet_x[i] - 3, bullet_y[i] - 3,
bullet_x[i] + 3, bullet_y[i] + 3);
}
i++;
}
}
Слайд 35Много пуль: перемещение всех пуль
void MoveBullet() {
int i = 0;
while
(i < NUM_BULLET) {
bullet_x[i] += bullet_vx[i];
bullet_y[i] += bullet_vy[i];
i++;
}
}
Слайд 36Много пуль: выстрел пушки
void ShotCannon() {
if (cnt_bullet >= NUM_BULLET)
return;
int r2
= 70;
int x2 = 500 + (int)(cos(alpha) * r2);
int y2
= 450 + (int)(sin(alpha) * r2);
int vr = 10;
int vx = (int)(cos(alpha) * vr);
int vy = (int)(sin(alpha) * vr);
bullet_x[cnt_bullet] = x2;
bullet_y[cnt_bullet] = y2;
bullet_vx[cnt_bullet] = vx;
bullet_vy[cnt_bullet] = vy;
bullet_state[cnt_bullet] = IN_FLIGHT;
cnt_bullet++;
}
Слайд 37Много пуль: проверка контакта
void DestroyABullet(int index_bullet) {
bullet_state[index_bullet] = DESTROYED;
}
void CheckContact()
{
int i = 0;
while (i < NUM_BULLET) {
if (bullet_state[i] ==
IN_FLIGHT
&&
InsidePlane(plane_x, plane_y,
bullet_x[i], bullet_y[i])) {
DestroyPlane();
DestroyABullet(i);
}
i++;
}
}
Слайд 38Демонстрация сборки проекта из кода презентации
Слайд 39Домашнее задание **
** Собрать игрушку из того, что есть в
слайдах
*** Самолетов – много. Они добавляются постепенно.
**** Сделать игру
со множеством объектов по собственному сценарию (Пример: сбор грибов – у каждого гриба свои координаты)
Слайд 40Источники информации
http://www.frolov-lib.ru/books/bsp/v14/ch2_3.htm - Рисование геометрических фигур
Google.com