Слайд 1Основы программирования
Лабораторная работа №6
Игра с массивом
Власенко О.Ф.
Слайд 2Простейшая игра – разбомби сарай!
Слайд 3Глобальные переменные
// Глобальные переменные:
HINSTANCE hInst;
// текущий экземпляр
WCHAR szTitle[MAX_LOADSTRING]; // Текст строки заголовка
WCHAR szWindowClass[MAX_LOADSTRING]; // имя класса главного окна
// самолет
int plane_x = 100;
int plane_y = 100;
int plane_vx = 10;
int plane_vy = 0;
Слайд 4Глобальные переменные
// бомба
int bomb_state = 0; // 0 - в
самолете готова к сбросу, 1 - летит к цели,
//
2-9 - взрывается прямо сейчас, 10 - взорвалась
int bomb_x;
int bomb_y;
int bomb_vx;
int bomb_vy;
// цель
int goal_exist = 1; // 1 - цель существует, 0 - не существует
int goal_x = 600;
int goal_y = 400;
int goal_width = 200;
int goal_height = 70;
Слайд 5Рисование самолета
void DrawPlane(HDC hdc) {
HPEN hPen = CreatePen(PS_SOLID, 10, RGB(0,
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);
DeleteObject(hPen);
}
Слайд 6Перемещение самолета
void MovePlane() {
if (plane_x >= 1000) {
plane_x = 10;
}
plane_x
+= plane_vx;
plane_y += plane_vy;
}
Слайд 7Сброс бомбы
void Bombing() {
if (bomb_state == 0) {
bomb_x = plane_x;
bomb_y
= plane_y;
bomb_vx = plane_vx;
bomb_vy = 10;
bomb_state = 1; // бомба
летит к цели
}
}
Слайд 8Перемещение (падение) бомбы
void MoveBomb() {
if (bomb_state == 1) {
bomb_x +=
bomb_vx;
bomb_y += bomb_vy;
}
}
Слайд 9Отрисовка бомбы (1)
void DrawBomb(HDC hdc) {
//int bomb_state;
// 0 -
в самолете готова к сбросу, 1 - летит к цели,
// 2-9 - взрывается прямо сейчас, 10 - взорвалась
if (bomb_state == 1) {
HPEN hPen = CreatePen(PS_SOLID, 3, RGB(0, 0, 0));
SelectObject(hdc, hPen);
SelectObject(hdc, GetStockObject(NULL_BRUSH));
Ellipse(hdc, bomb_x - 3, bomb_y - 3, bomb_x + 3, bomb_y + 3);
DeleteObject(hPen);
}
Слайд 10Отрисовка бомбы (2)
else if (bomb_state == 2) {
HPEN hPen =
CreatePen(PS_SOLID, 3, RGB(255, 255, 0));
SelectObject(hdc, hPen);
HBRUSH hBrush2 = CreateHatchBrush(HS_DIAGCROSS, RGB(255,
255, 128));
SelectObject(hdc, hBrush2);
SelectObject(hdc, GetStockObject(NULL_BRUSH));
Ellipse(hdc, bomb_x - 10, bomb_y - 10, bomb_x + 10, bomb_y + 10);
DeleteObject(hPen);
DeleteObject(hBrush2);
bomb_state = 3;
}
Слайд 11Отрисовка бомбы (3)
else if (bomb_state == 3) {
HPEN hPen =
CreatePen(PS_SOLID, 3, RGB(255, 255, 0));
SelectObject(hdc, hPen);
HBRUSH hBrush2 = CreateHatchBrush(HS_DIAGCROSS, RGB(255,
255, 128));
SelectObject(hdc, hBrush2);
SelectObject(hdc, GetStockObject(NULL_BRUSH));
Ellipse(hdc, bomb_x - 20, bomb_y - 20, bomb_x + 20, bomb_y + 20);
DeleteObject(hPen);
DeleteObject(hBrush2);
bomb_state = 4;
}
Слайд 12Отрисовка бомбы (4)
else if (bomb_state == 4) {
HPEN
hPen = CreatePen(PS_SOLID, 3, RGB(255, 255, 0));
SelectObject(hdc, hPen);
HBRUSH hBrush2 =
CreateHatchBrush(HS_DIAGCROSS, RGB(255, 255, 128));
SelectObject(hdc, hBrush2);
SelectObject(hdc, GetStockObject(NULL_BRUSH));
Ellipse(hdc, bomb_x - 30, bomb_y - 30, bomb_x + 30, bomb_y + 30);
DeleteObject(hPen);
DeleteObject(hBrush2);
bomb_state = 10;
}
}
Слайд 13Проверка контакта бомбы с чем-нибудь
void CheckContact() {
if (bomb_state ==
1) {
// если попали в цель
if (goal_exist
&&
(bomb_x >= goal_x) && (bomb_x <= goal_x + goal_width) &&
(bomb_y >= goal_y) && (bomb_y <= goal_y + goal_height)
)
{
bomb_state = 2; // бомба начала взрываться
goal_exist = 0; // цель больше не существует!
}
// если бомба попала в землю
else if (bomb_y > 500) {
bomb_state = 2; // бомба начала взрываться
}
}
}
Слайд 14Отрисовка цели
void DrawGoal(HDC hdc) {
if (goal_exist) {
HPEN hPen = CreatePen(PS_SOLID, 2, RGB(0, 0, 128));
SelectObject(hdc, hPen);
Rectangle(hdc, goal_x,
goal_y, goal_x + goal_width, goal_y + goal_height);
DeleteObject(hPen);
}
}
Слайд 15WndProc (1)
//
// ФУНКЦИЯ: WndProc(HWND, UINT, WPARAM, LPARAM)
LRESULT CALLBACK WndProc(HWND hWnd,
UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
…
case WM_KEYDOWN:
switch
(wParam)
{
case VK_RETURN:
Bombing();
InvalidateRect(hWnd, NULL, TRUE);
break;
}
break;
Слайд 16WndProc (2)
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
// TODO: Добавьте
сюда любой код прорисовки, использующий HDC...
DrawPlane(hdc);
DrawBomb(hdc);
DrawGoal(hdc);
EndPaint(hWnd, &ps);
}
break;
Слайд 17WndProc (3)
case WM_CREATE:
SetTimer(hWnd, 1, 100, 0);
break;
case WM_TIMER:
MoveBomb();
MovePlane();
CheckContact();
InvalidateRect(hWnd, NULL, TRUE);
break;
…
Слайд 18Задача 1
Из исходников собрать работающую игру
Слайд 19Задача 2
Сделать взрыв бомбы не из 3 кадров, а из
6-8 кадров
Слайд 20Задача 3
Самолет несет запас бомб – не единственная бомба, а
6-8 бомб
Слайд 21Задача 3 (1)
Самолет несет запас бомб – не единственная бомба,
а 6-8 бомб
Бомба не одна, а N_BOMB!
Слайд 22Задача 3 (2)
Самолет несет запас бомб – не единственная бомба,
а 6-8 бомб
Сбрасываем очередную бомбу!
Слайд 23Задача 3 (3)
Самолет несет запас бомб – не единственная бомба,
а 6-8 бомб
Перемещение не одной, а N_BOMB бомб!
Слайд 24Задача 3 (4)
Самолет несет запас бомб – не единственная бомба,
а 6-8 бомб
Также нужно изменить код в функциях:
void DrawBomb(HDC hdc)
void CheckContact()
Слайд 25Задача 4
Имеется не одна мишень, а 4-8.
Слайд 26Задача 4 (1)
Имеется не одна мишень, а 4-8.
Мишень не одна,
а N_GOAL!
Слайд 27Задача 4 (2)
Имеется не одна мишень, а 4-8.
Мишень не одна,
а N_GOAL, и бомб не одна, а N_BOMB!
Слайд 28Задача 5
Имеется не один тип мишени, а несколько.
Слайд 29Задача 5 (1)
Имеется не один тип мишени, а несколько.
Каждой мишени
нужно задать тип:
Слайд 30Задача 5 (2)
Имеется не один тип мишени, а несколько.
Разные типы
мишеней отрисовываются по разному:
Слайд 31Задача 6.1 (ИЛИ 6.2)
Ведется счет побед и поражений (попаданий и
промахов).
Слайд 32Задача 6.2 (ИЛИ 6.1)
Что-то на ваш выбор
Слайд 34Домашнее задание
Доделать задачи, которые не успели сделать в классе.
Подготовить отчет
(см следующий слайд)
Принести на следующее занятие код финальной игры, чтобы
иметь возможность её продемонстрировать
Слайд 35Домашнее задание - оформление
Для сдачи домашней работы нужно подготовить отчет.
Отчет
состоит из:
Стандартного титульного листа
Задания на лабораторную работу (отдельная страница)
Лист(ы) с
расчетом всех картинок
Распечатки программы
Скриншот работающей программы
Блоксхем алгоритмов обработки массивов.
Заключение – выводы, чему научился