学习游戏编程的人都需要首先建立游戏的主框架,然后才是各种技术的运用。下面是一种PC游戏设计的思路。
这种架构是建立在状态转换基础上的。我们知道PC游戏经常可以分成许多状态,如:开始动画、主菜单、各个分菜单、游戏、游戏数据统计显示等状态。这样做的好处在于可以分别处理键输入并方便状态切换处理。
下面以C++ 为编程语言来实现:
首先设计一个基类(CState)来实现一些基本的状态功能,这是因为我们就是基于状态来架构游戏的。
CState
{
public:
CState(){}
~CState(){}
void Initial(); //进入此状态时的初始化操作
void CleanUp(); //退出此状态时的清理操作
void Pause(); //此状态暂停时操作
void Resume(); //重启此状态时的操作
void HandleEvents(); //处理输入和其它事件
void UpdateWorld(); //更新游戏世界数据
void DrawScene(); //绘制场景
};
建立了基类后以后所有的游戏状态都可以通过继承CState来得到。
其次设计一个状态管理类(CStateManage)来实现状态的转换和管理,其实可以理解为就是游戏本身。下面是一种设计:
#include <vector>
#include "state.h" //上面类的声明文件
CStateManage
{
public:
CStateManage(){}
~CStateManage(){}
void Initial()
{
m_Runing=true;
};
void CleanUp() {};
void ChangeState(CState * state);
void PushState(CState * state);
void PopState(CState * state);
void HandleEvents(); //处理输入和其它事件
void UpdateWorld(); //更新游戏世界数据
void DrawScene(); //绘制场景
void Run()
{
while(m_Runing)
{
HandleEvents();
UpdateWorld();
DrawScene();
}
}; //进入游戏执行
private:
bool m_Runing; //游戏是否继续执行
std::vector<CState *> m_States;
};
最后将这些结合到主函数中例如:
#include "statemanage.h"
void main (int argc, char * argv[])
{
CStateManage game;
game.Initial();
game.ChangeState( CIntroState::Instance() );
game.Run();
game.CleanUp();
}
这样就建立起一个基于状态转化的游戏架构。
参考:
Managing Game States in C++(http://tonyandpaige.com/tutorials/game1.html)或者中文翻译的(http://blog.csdn.net/mythma/archive/2005/05/01/370174.aspx)