Основы программирования. Лабораторная работа презентация

Содержание

Слайд 2

Очерчиваем клиентскую область

case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
// RECT -

Структура, в которой хранятся параметры прямоугольника
RECT rect;
//Определяем размер клиентской области окна
GetClientRect(hWnd, &rect);
// Рисуем прямоугольник по границам клиентской области окна
Rectangle(hdc, rect.left, rect.top, rect.right, rect.bottom);
EndPaint(hWnd, &ps);
}

Очерчиваем клиентскую область case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &ps);

Слайд 3

struct

В языке Си, структура (struct) — композитный тип данных, инкапсулирующий без сокрытия набор значений

различных типов. (https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0_%28%D1%8F%D0%B7%D1%8B%D0%BA_%D0%A1%D0%B8%29 )
Структура — это агрегатный тип данных. Она может содержать в себе разнотипные элементы. (http://cppstudio.com/post/5377/ )
// определение структуры
struct str_name
{
int member_1;
float member_2;
char member_3[256];
};
// объявление переменной-структуры
struct str_name struct0;

struct В языке Си, структура (struct) — композитный тип данных, инкапсулирующий без сокрытия

Слайд 4

Пример struct

struct tagRECT // определение структуры tagRECT
{
LONG left; // поле left

LONG top;
LONG right;
LONG bottom;
} ; 
int main()
{
  struct tagRECT rect;  // объявили переменную-структуру
 rect.left = 10; // поле left получило значение «10»
  rect.top = 20;
rect.right = 200;
rect.bottom = 300;
}

Пример struct struct tagRECT // определение структуры tagRECT { LONG left; // поле

Слайд 5

struct и typedef


typedef struct name
{
type atrib1;
type atrib2;
// остальные элементы структуры...
}

newStructName structVar1;
struct name structVar3;
newStructName structVar2;

struct и typedef typedef struct name { type atrib1; type atrib2; // остальные

Слайд 6

struct и typedef – пример (RECT)

// windef.h?
typedef struct tagRECT
{
LONG left;
LONG top;

LONG right;
LONG bottom;
} RECT, *PRECT, NEAR *NPRECT, FAR *LPRECT;

// Win32Project1.cpp:
// RECT - Структура, в которой хранятся параметры прямоугольника
RECT rect; // struct tagRECT rect;
//Определяем размер клиентской области окна
GetClientRect(hWnd, &rect);
// Рисуем прямоугольник по границам клиентской области окна
Rectangle(hdc, rect.left, rect.top, rect.right, rect.bottom);

struct и typedef – пример (RECT) // windef.h? typedef struct tagRECT { LONG

Слайд 7

Рисуем много линий из центра

case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
RECT

rect;
GetClientRect(hWnd, &rect);
int cx = rect.right / 2;
int cy = rect.bottom / 2;
int x = 0;
while (x < rect.right) {
MoveToEx(hdc, cx, cy, NULL);
LineTo(hdc, x, 5);
x += 20;
}
EndPaint(hWnd, &ps);
}

Рисуем много линий из центра case WM_PAINT: { PAINTSTRUCT ps; HDC hdc =

Слайд 8

Polygon

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);

Polygon POINT pt[5]; // Массив содержит структуры pt[0].x = 100; pt[0].y = 50;

Слайд 9

struct и typedef – пример 2 (POINT)

// windef.h?
typedef struct tagPOINT
{
LONG x;
LONG

y;
} POINT, *PPOINT, NEAR *NPPOINT, FAR *LPPOINT;

struct и typedef – пример 2 (POINT) // windef.h? typedef struct tagPOINT {

Слайд 10

Polygon

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);

Polygon POINT pt[5]; // Массив содержит структуры pt[0].x = 100; pt[0].y = 50;

Слайд 11

Polygon

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);

Polygon POINT pt[5]; pt[0].x = 100; pt[0].y = 50; pt[1].x = 150; pt[1].y

Слайд 12

Polygon

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);

Polygon POINT pt[5]; pt[0].x = 100; pt[0].y = 50; pt[1].x = 150; pt[1].y

Слайд 13

Polygon

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);

Polygon HBRUSH hBrush = CreateHatchBrush(HS_CROSS, RGB(128, 0, 128)); SelectObject(hdc, hBrush); Ellipse(hdc, 0, 0

Слайд 14

Polygon – прозрачная кисть

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);

Polygon – прозрачная кисть HBRUSH hBrush = CreateHatchBrush(HS_CROSS, RGB(128, 0, 128)); SelectObject(hdc, hBrush);

Слайд 15

Polyline

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);

Polyline POINT pt[5]; pt[0].x = 100; pt[0].y = 50; pt[1].x = 150; pt[1].y

Слайд 16

Источники информации

http://www.frolov-lib.ru/books/bsp/v14/ch2_3.htm - Рисование геометрических фигур

Источники информации http://www.frolov-lib.ru/books/bsp/v14/ch2_3.htm - Рисование геометрических фигур

Слайд 17

Добавляем в игру «Меткого зенитчика»

Добавляем в игру «Меткого зенитчика»

Слайд 18

Константы и подключаемые файлы

// 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];

Константы и подключаемые файлы // Lection6_1.cpp: определяет точку входа для приложения. // #include

Слайд 19

Функция WndProc (1)

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
  …
case

WM_TIMER:
MoveBomb();
MovePlane();
CheckContact();
MoveBullets(); // new!
CheckContactBullets();// new!
InvalidateRect(hWnd, NULL, TRUE);
break;

Функция WndProc (1) LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

Слайд 20

Функция WndProc (2)

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

код прорисовки. . .
DrawPlane(hdc);
DrawBomb(hdc);
DrawTarget(hdc);
DrawBullets(hdc); // new!!!
DrawCannon(hdc); // new!!!
EndPaint(hWnd, &ps);
}
break; 

Функция WndProc (2) case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &ps);

Слайд 21

Функция WndProc (3)

case WM_KEYDOWN:
switch (wParam)
{
case VK_RETURN:
Bombing();
InvalidateRect(hWnd, NULL, TRUE);
break;
// new!!!
case VK_LEFT:
MoveCannonLeft();
InvalidateRect(hWnd, NULL, TRUE);
break;
case VK_RIGHT:
MoveCannonRight();
InvalidateRect(hWnd,

NULL, TRUE);
break;
case VK_UP:
ShotCannon();
InvalidateRect(hWnd, NULL, TRUE);
break;
}
break;

Функция WndProc (3) case WM_KEYDOWN: switch (wParam) { case VK_RETURN: Bombing(); InvalidateRect(hWnd, NULL,

Слайд 22

Модель (глобальные данные) (1)

// Глобальные переменные:
// самолет
int plane_x = 100;
int plane_y = 100;
int

plane_vx = 10;
int plane_vy = 0;
// new!!!
//int plane_state = 1; // 1 - in flight, 2 - destroyed
enum State {
IN_STOCK,
IN_FLIGHT,
DESTROYED
};
State plane_state = IN_FLIGHT; 

Модель (глобальные данные) (1) // Глобальные переменные: // самолет int plane_x = 100;

Слайд 23

Модель (глобальные данные) (2)

// new!!!
// структура для пули
struct Bullet {
int x;
int y;
int vx;
int

vy;
//int state = 0; // 0 - in stock, 1 - in flight, 2 - destroyed
//enum State {
//IN_STOCK,
//IN_FLIGHT,
//DESTROYED
//};
State state;
};
// пуля
struct Bullet bullet = { 430, 445, 0, 0, IN_STOCK };

Модель (глобальные данные) (2) // new!!! // структура для пули struct Bullet {

Слайд 24

Модель (глобальные данные) (3)

// зенитное орудие
double alpha = M_PI * 3.0 / 2.0;

// направление стрельбы
// СТРОГО ВВЕРХ 

Модель (глобальные данные) (3) // зенитное орудие double alpha = M_PI * 3.0

Слайд 25

Зенитное орудие - отрисовка

 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);
}

Зенитное орудие - отрисовка void DrawCannon(HDC hdc) { HPEN hPen = CreatePen(PS_SOLID, 3,

Слайд 26

Вспоминаем тригонометрию

Численные значения тригонометрических функций угла в тригонометрической окружности с радиусом, равным единице

Вспоминаем тригонометрию Численные значения тригонометрических функций угла в тригонометрической окружности с радиусом, равным единице

Слайд 27

Зенитное орудие - управление

 void MoveCannonRight() { 
if (alpha < M_PI * 1.95)
alpha += M_PI

/ 20;
}
void MoveCannonLeft() {
if (alpha > M_PI * 1.05)
alpha -= M_PI / 20;
}

Зенитное орудие - управление void MoveCannonRight() { if (alpha alpha += M_PI /

Слайд 28

Зенитное орудие - выстрел

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;
}

Зенитное орудие - выстрел void ShotCannon() { if (bullet.state != IN_STOCK) return; int

Слайд 29

Самолет - отрисовка

void DrawPlane(HDC hdc) {
// new!!!
HPEN hPen = NULL;
if (plane_state != DESTROYED)
hPen

= CreatePen(PS_SOLID, 10, RGB(0, 255, 0));
else
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);
DeleteObject(hPen);

Самолет - отрисовка void DrawPlane(HDC hdc) { // new!!! HPEN hPen = NULL;

Слайд 30

Самолет – проверка попадания в

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;

Самолет – проверка попадания в int InsidePlane(int plane_x, int plane_y, int x, int

Слайд 31

Самолет – уничтожение
void DestroyPlane() {
plane_state = DESTROYED;
}

Самолет – уничтожение void DestroyPlane() { plane_state = DESTROYED; }

Слайд 32

Пуля – отрисовка, перемещение и уничтожение

void DrawBullets(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 MoveBullets() {
bullet.x += bullet.vx;
bullet.y += bullet.vy;
}
void DestroyABullet() {
bullet.state = DESTROYED;
}

Пуля – отрисовка, перемещение и уничтожение void DrawBullets(HDC hdc) { if (bullet.state ==

Слайд 33

Пуля – проверка контакта пули и самолета

void CheckContactBullets() {
if (bullet.state == IN_FLIGHT
&& InsidePlane(plane_x,

plane_y, bullet.x, bullet.y)) {
DestroyPlane();
DestroyABullet();
}
}

Пуля – проверка контакта пули и самолета void CheckContactBullets() { if (bullet.state ==

Слайд 34

Демонстрация сборки проекта из кода презентации

Демонстрация сборки проекта из кода презентации

Слайд 35

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

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

Слайд 36

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

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;
}

А если окно не того размерчика? BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { hInst

Слайд 37

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

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;
}

А если окно не того размерчика? BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { hInst

Слайд 38

Задача 1

Добавить «Меткого зенитчика» в предыдущий код вашей игры
ВАЖНО – сохранить предыдущий код

– для возможности «отката» если что-то пойдет не так!

Задача 1 Добавить «Меткого зенитчика» в предыдущий код вашей игры ВАЖНО – сохранить

Слайд 39

Задача 2

Добавить на небо 5-7 звезд
Каждая звезда создается при помощи Polygon по образцу

функции на слайде
Пример кода через точки и MoveToEx и LineTo:

Задача 2 Добавить на небо 5-7 звезд Каждая звезда создается при помощи Polygon

Слайд 40

Задача 2 – пример кода через Polyline

Задача 2 – пример кода через Polyline

Слайд 41

Задача 3

Сделать 3 типа звезд – с разной заливкой. Использовать Polygon.
Назвать функции Star1(),

Star2() и Star3().
Используя их на небе в игре нарисовать несколько рядов звёзд.

Задача 3 Сделать 3 типа звезд – с разной заливкой. Использовать Polygon. Назвать

Имя файла: Основы-программирования.-Лабораторная-работа.pptx
Количество просмотров: 61
Количество скачиваний: 0