Оглавление
- Введение в игру 1
- Ход игры 1
- дизайн интерфейса 2
- План проекта 2
4.1 Архитектура системы 2
4.2 Основной поток кода 2 - Резюме и выводы 3
- Ссылка 3
4.2 Поток основного кода
Ниже показана основная часть игровой логики, где расположен основной код, и поток выполнения функции Run_Timer.
Запуск процесса: вызывается WinProc.
S0: обновить глобальные переменные таймера.
S1: Пересеките все вражеские самолеты, вызовите HitHero, чтобы определить, сталкивается ли он с нашим самолетом (например, столкновение, отметьте вражеский самолет).
S2: Прохождение через все пули и все самолеты, вызывая Hit, чтобы определить, попали ли они (например, попадание, маркировка пуль и самолетов).
S3: Пройдитесь по всем реквизитам, вызовите GetToy, чтобы определить, были ли они подобраны машиной (например, подобрать, пометить реквизит, создать эффекты реквизита и установить соответствующие глобальные переменные).
S4: Оцените текущий счет и уровень и при необходимости улучшите уровень.
S5: Оцените значение глобальной переменной таймера, если оно соответствует требованиям по частоте, создайте новый вражеский самолет.
S6: Пересеките все вражеские самолеты и создайте перемещение.
S7: Оцените значение глобальной переменной таймера, если оно соответствует требованию частоты, случайным образом заставьте вражеский самолет генерировать новые пули с определенной вероятностью.
S8: Пересекая все вражеские самолеты, если они вылетают за пределы экрана, вызовите DestroyPlane, чтобы очистить их.
S9: Пересеките все пули и создайте смещение.
S10: Переместите все опоры, чтобы создать смещение.
S11: Оцените значение глобальной переменной таймера, если оно соответствует требованию частоты, заставьте мою машину генерировать новые пули. В соответствии с информацией об элементе, записанной в глобальной переменной, генерируются различные маркеры, а глобальная переменная времени охлаждения элемента обновляется.
S12: Дополнительные очки.
S13: очистить недопустимые плоскости. Обходя все вражеские самолеты, если обнаружится, что он помечен, вызовите DestroyPlane, чтобы очистить его. Реквизит генерируется при зачистке большого самолета, а toyBLD генерируется с большей вероятностью, когда у Героя почти нет здоровья.
S14: очистить недопустимые маркеры. Пройдите все пули, если обнаружится, что они помечены, вызовите DestoryBullet, чтобы очистить их.
S15: Очистите недопустимые реквизиты. Пройдитесь по всем объектам, если они отмечены, вызовите DestoryToy, чтобы очистить их.
S16: Кадр анимации движется вперед.
В конце процесса поток управления возвращается WinProc для рисования.
#include "DigitPlane.h"
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
WNDCLASSEX wcex;
HWND hWnd;
MSG msg;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APP_ICON));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
if (!RegisterClassEx(&wcex))
{
MessageBox(NULL,
_T("Call to RegisterClassEx failed!"),
_T("Mega Plane"),
MB_OK);
return 1;
}
// The parameters to CreateWindow explained:
// szWindowClass: the name of the application
// szTitle: the text that appears in the title bar
// WS_OVERLAPPEDWINDOW: the type of window to create,~WS_THICKFRAME fixed window size
// CW_USEDEFAULT, CW_USEDEFAULT: initial position (x, y)
// WNDWIDTH, WNDHEIGHT: initial size (width, length)
// NULL: the parent of this window
// NULL: this application does not have a menu bar
// hInstance: the first parameter from WinMain
// NULL: not used in this application
hWnd = CreateWindow(
szWindowClass,
szTitle,
WS_OVERLAPPEDWINDOW, //& ~WS_THICKFRAME,
//CW_USEDEFAULT, CW_USEDEFAULT,
20,20,
O_WNDWIDTH + WNDWIDTH_PLUS, O_WNDHEIGHT + WNDHEIGHT_PLUS,
NULL,
NULL,
hInstance,
NULL
);
if (!hWnd)
{
MessageBox(NULL,
_T("Call to CreateWindow failed!"),
_T("Mega Plane"),
MB_OK);
return 1;
}
// The parameters to ShowWindow explained:
// hWnd: the value returned from CreateWindow
// nCmdShow: the fourth parameter from WinMain
ShowWindow(hWnd,
nCmdShow);
UpdateWindow(hWnd);
// Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
BITMAP bmp;
POINT ptMouse;
int i;
switch (message)
{
case WM_CREATE:
//加载位图资源
m_hBackgroundBmp = LoadBitmap(((LPCREATESTRUCT)lParam)->hInstance,
MAKEINTRESOURCE(IDB_BACKGROUND));
m_hHeroBmp = LoadBitmap(((LPCREATESTRUCT)lParam)->hInstance,
MAKEINTRESOURCE(IDB_HERO));
m_hHeroBulletBmp = LoadBitmap(((LPCREATESTRUCT)lParam)->hInstance,
MAKEINTRESOURCE(IDB_HERO_BULLET));
for (i = 0; i < ENEMY_TYPE_NUM; i++)
{
m_hEnemyBmp[i] = LoadBitmap(((LPCREATESTRUCT)lParam)->hInstance,
MAKEINTRESOURCE(m_enemyBmpNames[i]));
}
m_hGameStatusBmp = LoadBitmap(((LPCREATESTRUCT)lParam)->hInstance,
MAKEINTRESOURCE(IDB_GAME_STATUS));
m_hToysBmp = LoadBitmap(((LPCREATESTRUCT)lParam)->hInstance,
MAKEINTRESOURCE(IDB_TOYS));
Initialize_Game();
m_gameStatus.isPaused = FALSE;
m_gameStatus.isStarting = TRUE;
{
//位图相关
GetObject(m_hGameStatusBmp, sizeof(BITMAP), &bmp);
m_gameStatus.size.cx = bmp.bmWidth;
m_gameStatus.size.cy = bmp.bmHeight / 2;
m_gameStatus.hBmp = m_hGameStatusBmp;
}
srand((unsigned int)time(NULL));
timer_i = 0;
//开始背景音乐
PlaySound(MAKEINTRESOURCE(IDR_WAVE1),GetModuleHandle(NULL),SND_LOOP|SND_ASYNC|SND_RESOURCE);
break;
case WM_SIZE:
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam);
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
//绘制
Render(hdc);
EndPaint(hWnd, &ps);
break;
case WM_KEYUP:
switch (wParam)
{
case VK_LEFT:
case VK_RIGHT:
case VK_UP:
case VK_DOWN:
MOVE_HERO = 0;
break;
}
break;
case WM_KEYDOWN:
switch (wParam)
{
case VK_LEFT:
case VK_RIGHT:
case VK_UP:
case VK_DOWN:
MOVE_HERO = wParam;
break;
case VK_SPACE:
if(m_Planes[0].status == 0)
{
//Restart_Game
Initialize_Game();
}
else
{
if(m_gameStatus.isStarting)
{
SetTimer(hWnd, TIMER, 50, NULL);
m_gameStatus.isStarting = FALSE;
InvalidateRect(hWnd, NULL, FALSE);
}
else
Pause_Game(hWnd);
}
break;
case 'B':
m_Toys[Toy_Count] = CreateToy(toyBLD);
break;
case 'D':
m_Toys[Toy_Count] = CreateToy(toyDBL);
break;
case 'C':
m_Toys[Toy_Count] = CreateToy(toyCLS);
break;
case 'R':
m_Toys[Toy_Count] = CreateToy(toyRAD);
break;
case 'S':
m_Toys[Toy_Count] = CreateToy(toySUB);
break;
case 'M'://狂躁模式,各种子弹特效全开
DBLBullet = TRUE;
RADBullet = TRUE;
SUBBullet = TRUE;
break;
default:
break;
}
break;
case WM_LBUTTONDOWN:
ptMouse.x = LOWORD(lParam);
ptMouse.y = HIWORD(lParam);