WinAPI – игра №1. Таймер. Цикл while

Содержание

Слайд 2

А если окно не того размерчика?

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
hInst =

А если окно не того размерчика? BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) {
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;
}

Слайд 3

А если окно не того размерчика?

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
hInst =

А если окно не того размерчика? BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) {
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;
}

Слайд 4

Простейшая игра – разбомби сарай!

Простейшая игра – разбомби сарай!

Слайд 5

Цикл с постусловием do while

do {
Действие;
} while (Условие);

Цикл с постусловием do while do { Действие; } while (Условие);

Слайд 6

Пример для цикла do while

Население города увеличивается на 3% каждый год. В

Пример для цикла do while Население города увеличивается на 3% каждый год.
2014 году население города составляло 650 000 человек. Напишите программу, которая выведет на экран предсказываемую численность населения города в каждом году, вплоть до 2040.

Слайд 7

Пример для цикла do while

Население города увеличивается на 3% каждый год. В

Пример для цикла do while Население города увеличивается на 3% каждый год.
2014 году население города составляло 650 000 человек. Напишите программу, которая выведет на экран предсказываемую численность населения города в каждом году, вплоть до 2040.

Слайд 8

Программа и блок-схема

void main() {
int year = 2014;
long population =

Программа и блок-схема void main() { int year = 2014; long population
650000;
do {
printf("%li inhabitants live in the city in %i\n",
population, year);
population = (population * 103) / 100;
year = year + 1;
} while (year <= 2040);
}

Слайд 9

Цикл с предусловием while

while (Условие) {
Действие;
}

Цикл с предусловием while while (Условие) { Действие; }

Слайд 10

Пример кода с while

int j = 1; // инициализация счетчика цикла
while (j

Пример кода с while int j = 1; // инициализация счетчика цикла
<= 5) { // условие продолжения цикла
printf(“%d “, j);
j++; // изменение счетчика цикла
}

Слайд 11

Глобальные переменные

// Глобальные переменные:
HINSTANCE hInst; // текущий экземпляр
WCHAR szTitle[MAX_LOADSTRING]; // Текст строки

Глобальные переменные // Глобальные переменные: 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;

Слайд 12

Глобальные переменные

// бомба
int bomb_state = 0; // 0 - в самолете готова

Глобальные переменные // бомба int bomb_state = 0; // 0 - в
к сбросу, 1 - летит к цели,
// 2-9 - взрывается прямо сейчас, 10 - взорвалась
int bomb_x;
int bomb_y;
int bomb_vx;
int bomb_vy;
// цель
int target_exist = 1; // 1 - цель существует, 0 - не существует
int target_x = 600;
int target_y = 400;
int target_width = 200;
int target_height = 70;

Слайд 13

Рисование самолета

void DrawPlane(HDC hdc) {
HPEN hPen = CreatePen(PS_SOLID, 10, RGB(0, 255, 0));
SelectObject(hdc,

Рисование самолета void DrawPlane(HDC hdc) { HPEN hPen = CreatePen(PS_SOLID, 10, RGB(0,
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);
}

Слайд 14

Перемещение самолета

void MovePlane() {
if (plane_x >= 1000) {
plane_x = 10;
}
plane_x += plane_vx;
plane_y

Перемещение самолета void MovePlane() { if (plane_x >= 1000) { plane_x =
+= plane_vy;
}

Слайд 15

Сброс бомбы

void Bombing() {
if (bomb_state == 0) {
bomb_x = plane_x;
bomb_y = plane_y;
bomb_vx

Сброс бомбы void Bombing() { if (bomb_state == 0) { bomb_x =
= plane_vx;
bomb_vy = 10;
bomb_state = 1; // бомба летит к цели
}
}

Слайд 16

Перемещение (падение) бомбы

void MoveBomb() {
if (bomb_state == 1) {
bomb_x += bomb_vx;
bomb_y +=

Перемещение (падение) бомбы void MoveBomb() { if (bomb_state == 1) { bomb_x
bomb_vy;
}
}

Слайд 17

Отрисовка бомбы (1)

void DrawBomb(HDC hdc) {
//int bomb_state;
// 0 - в самолете

Отрисовка бомбы (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);
}

Слайд 18

Отрисовка бомбы (2)

else if (bomb_state == 2) {
HPEN hPen = CreatePen(PS_SOLID, 3,

Отрисовка бомбы (2) else if (bomb_state == 2) { HPEN hPen =
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;
}

Слайд 19

Отрисовка бомбы (3)

else if (bomb_state == 3) {
HPEN hPen = CreatePen(PS_SOLID, 3,

Отрисовка бомбы (3) else if (bomb_state == 3) { HPEN hPen =
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;
}

Слайд 20

Отрисовка бомбы (4)

else if (bomb_state == 4) {
HPEN hPen =

Отрисовка бомбы (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;
}
}

Слайд 21

Проверка контакта бомбы с чем-нибудь

void CheckContact() {
if (bomb_state == 1) {

Проверка контакта бомбы с чем-нибудь void CheckContact() { if (bomb_state == 1)
// если попали в цель
if (target_exist
&&
(bomb_x >= target_x) && (bomb_x <= target_x + target_width) &&
(bomb_y >= target_y) && (bomb_y <= target_y + target_height)
)
{
bomb_state = 2; // бомба начала взрываться
target_exist = 0; // цель больше не существует!
}
// если бомба попала в землю
else if (bomb_y > 500) {
bomb_state = 2; // бомба начала взрываться
}
}
}

Слайд 22

Отрисовка цели
void DrawTarget(HDC hdc) {
if (target_exist) {
HPEN hPen = CreatePen(PS_SOLID,

Отрисовка цели void DrawTarget(HDC hdc) { if (target_exist) { HPEN hPen =
2, RGB(0, 0, 128));
SelectObject(hdc, hPen);
Rectangle(hdc, target_x, target_y,
target_x + target_width, target_y + target_height);
DeleteObject(hPen);
}
}

Слайд 23

WndProc (1)

//
// ФУНКЦИЯ: WndProc(HWND, UINT, WPARAM, LPARAM)
LRESULT CALLBACK WndProc(HWND hWnd, UINT message,

WndProc (1) // // ФУНКЦИЯ: WndProc(HWND, UINT, WPARAM, LPARAM) LRESULT CALLBACK WndProc(HWND
WPARAM wParam, LPARAM lParam)
{
switch (message)
{

case WM_KEYDOWN:
switch (wParam)
{
case VK_RETURN:
Bombing();
InvalidateRect(hWnd, NULL, TRUE);
break;
}
break;

Слайд 24

WndProc (2)

case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
// TODO: Добавьте сюда любой

WndProc (2) case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &ps);
код прорисовки, использующий HDC...
DrawPlane(hdc);
DrawBomb(hdc);
DrawTarget(hdc);
EndPaint(hWnd, &ps);
}
break;

Слайд 25

WndProc (3)

case WM_CREATE:
SetTimer(hWnd, 1, 100, 0);
break;
case WM_TIMER:
MoveBomb();
MovePlane();
CheckContact();
InvalidateRect(hWnd, NULL, TRUE);
break;

WndProc (3) case WM_CREATE: SetTimer(hWnd, 1, 100, 0); break; case WM_TIMER: MoveBomb();

Слайд 26

Задача 1

Из исходников собрать работающую игру

Задача 1 Из исходников собрать работающую игру

Слайд 27

Задача 2

Сделать взрыв бомбы не из 3 кадров, а из 6-8 кадров

Задача 2 Сделать взрыв бомбы не из 3 кадров, а из 6-8 кадров

Слайд 28

Задача 3

Самолет несет запас бомб – не единственная бомба, а 6-8 бомб

Задача 3 Самолет несет запас бомб – не единственная бомба, а 6-8 бомб

Слайд 29

Задача 3 (1)

Самолет несет запас бомб – не единственная бомба, а 6-8

Задача 3 (1) Самолет несет запас бомб – не единственная бомба, а
бомб
Бомба не одна, а N_BOMB!

Слайд 30

Задача 3 (2)

Самолет несет запас бомб – не единственная бомба, а 6-8

Задача 3 (2) Самолет несет запас бомб – не единственная бомба, а
бомб
Сбрасываем очередную бомбу!

Слайд 31

Задача 3 (3)

Самолет несет запас бомб – не единственная бомба, а 6-8

Задача 3 (3) Самолет несет запас бомб – не единственная бомба, а
бомб
Перемещение не одной, а N_BOMB бомб!

Слайд 32

Задача 3 (4)

Самолет несет запас бомб – не единственная бомба, а 6-8

Задача 3 (4) Самолет несет запас бомб – не единственная бомба, а
бомб
Также нужно изменить код в функциях:
void DrawBomb(HDC hdc)
void CheckContact()
Имя файла: WinAPI-–-игра-№1.-Таймер.-Цикл-while.pptx
Количество просмотров: 32
Количество скачиваний: 0