51Testing软件测试论坛

标题: 游戏入口控制的基本部分 [打印本页]

作者: 51testing    时间: 2008-1-10 17:23
标题: 游戏入口控制的基本部分
先建了一个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的初始化了




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2