先建了一个CGame类,把游戏控制的基本部分包装起来。
结构如下:
#pragma once
class CGame
{
public:
CGame(void);
~CGame(void);
// 开始游戏
int Start(void);
private:
// 游戏消息循环
int GameLoop(void);
// 游戏运行状态
bool bIsRunning;
};
然后把WinMain里面的消息循环放到了GameLoop里面
在WinMain里面原本消息循环的位置调用Game::Start()代替
// // 开始游戏
int CGame::Start(void)
{
// 读取游戏设置
// 初始化DirectDraw
//
bIsRunning = true;
return GameLoop();
}
// 游戏消息循环
int CGame::GameLoop(void)
{
MSG msg;
while (bIsRunning)
{
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message==WM_QUIT)
{
//myDebug->OutDebug("Game Terminated.../n");
//break;
bIsRunning = false;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}
消息循环部分还需要修改,在游戏窗口在非活动状态的时候等待消息,以阻塞线程,降低CPU资源占用。
在回调函数WndProc里面,加入检测窗口是否在活动状态的代码:
case WM_ACTIVATE: //应用程序是否活动
if(LOWORD(wParam)==WA_INACTIVE)
geGame.SetActive(false);
else if(HIWORD(wParam))
{
geGame.SetActive(false);
return 0;
}
else
{
SetCursor(NULL);
Game.SetActive(true);
}
上面的代码有两处SetActive(false),原理是从gpgame的圣剑2 copy的(现在好像个人/小团队开发的游戏都离不开“剑”字)还没搞清原理。不过需要注意的是,从非活动状态恢复的时候,需要重新获取输入、绘图设备等等。
至此CGame类大致的架构已经出来了。源码如下:
//Game.cpp
#include "StdAfx.h"
#include "./game.h"
CGame::CGame(void)
: bIsRunning(false)
, bActive(false)
{
}
CGame::~CGame(void)
{
}
// // 开始游戏
int CGame::Start(void)
{
// 读取游戏设置
// 初始化DirectDraw
// 开始游戏
bIsRunning = true;
return GameLoop();
}
// 游戏消息循环
int CGame::GameLoop(void)
{
MSG msg;
while (bIsRunning)
{
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message==WM_QUIT)
{
bIsRunning = false; //退出游戏
break;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}else if(!bActive){
WaitMessage(); //等待消息
}else{
MainLoop(); //游戏主循环
}
}
return msg.wParam;
}
// 设置窗口是否活动
void CGame::SetActive(bool Active)
{
bActive = Active;
}
// 游戏主循环,负责更新状态,绘图翻页,响应等
void CGame::MainLoop(void)
{
return;
}
//Game.h
#pragma once
class CGame
{
public:
CGame(void);
~CGame(void);
// // 开始游戏
int Start(void);
private:
// 游戏消息循环
int GameLoop(void);
// 游戏运行状态
bool bIsRunning;
public:
// 窗口是否活动状态
bool bActive;
// 设置窗口是否活动
void SetActive(bool Active);
// 游戏主循环,负责更新状态,绘图,响应等
void MainLoop(void);
};
下一次就是DirectX的初始化了