51testing 发表于 2008-1-10 17:23:16

游戏入口控制的基本部分

先建了一个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的初始化了
页: [1]
查看完整版本: 游戏入口控制的基本部分