这个是我之前做的一个2D游戏(未完成)中的一部分,
实现的整个游戏的状态机引擎部分框架,在此分享一下我的代码。
众所周知,一个游戏(或者一个应用程序),我们都可以把各部分界面切分为不同的状态,然后整个系统过程就是一个有限状态机。
我这里做的工作就是实现这个状态机框架以及具体的调度过程。
游戏主引擎类头文件
/*
* CopyRight 2009 - 2010 GDE工作室
* 游戏主引擎
* ===================================
* 09/12/12 cg create
*/
#ifndef GDE_GAMEENGINE_H_
#define GDE_GAMEENGINE_H_
#pragma warning(disable:4251)
#pragma warning(disable:4244)
#pragma warning(disable:4018)
#pragma warning(disable:4101)
#pragma warning(disable:4996)
namespace GDE{
//游戏引擎状态
enum GDE_GameEngineStatus
{
Empty = 0, //空
Scence, //场景、菜单渲染
Battle, //战斗
RunningScript //脚本解析
};
//游戏主引擎类
class GDE_GameEngine
{
public:
GDE_GameEngine()
: status_( Empty )
, isquit_( false )
{}
~GDE_GameEngine(){ this->release(); }
void run(); //运行
private:
void init(); //初始化
void release(); //释放
void run_scence(); //运行场景
void run_script(); //解析脚本
void run_battle(); //运行战场
private:
GDE_GameEngineStatus status_; //引擎状态
bool isquit_; //是否退出
};//class GDE_GameEngine
}//namespace GDE
#endif
实现的核心部分代码
void GDE_GameEngine::run()
{
this->init();
status_ = Scence;
//status_ = Battle;
while( isquit_ == false )
{
switch( this->status_ )
{
case Scence:
run_scence();
break;
case RunningScript:
run_script();
break;
case Battle:
run_battle();
break;
default:
break;
}
}
}
对于每一个状态处理器,我定义了一个基类,必须实现状态处理过程,以及反馈给游戏引擎处理结果。
如下面定义的GDE_GameEngineHelper
/*
* CopyRight 2009 - 2010 GDE工作室
* 游戏引擎 - 引擎辅助类组
* ===================================
* 09/12/12 cg create
*/
#ifndef GDE_SCRIPT_EXECUTER_H_
#define GDE_SCRIPT_EXECUTER_H_
#include <string>
#include "GDE_MAP/GDE_map.h"
#include "GDE_GameEngine.h"
namespace GDE
{
//游戏引擎辅助类
class GDE_GameEngineHelper
{
public:
GDE_GameEngineHelper(){}
virtual ~GDE_GameEngineHelper(){}
/**
* 辅助类运行
*
* \param[in] status 改变游戏引擎状态
* \param[in] target_filename 目标文件名
*
*/
virtual void run( GDE_GameEngineStatus& status, std::string& target_filename ) = 0;
};
//脚本执行器
class GDE_ScriptExecuter : public GDE_GameEngineHelper
{
public:
GDE_ScriptExecuter( std::string start_file_id );//起始脚本ID
virtual void run( GDE_GameEngineStatus& status, std::string& target_filename );//执行
private:
void dialog();
void combobox();
void war();
void item();
void checkitem();
void info();
void backpic();
void music();
};
//场景渲染器
class GDE_ScenceRender : public GDE_GameEngineHelper
{
public:
GDE_ScenceRender( std::string filename );//场景
virtual void run( GDE_GameEngineStatus& status, std::string& target_filename );//执行
};
//战场管理器
class GDE_BattleManager : public GDE_GameEngineHelper
{
public:
GDE_BattleManager( std::string filename );//战场数据文件
virtual void run( GDE_GameEngineStatus& status, std::string& target_filename );//执行
private:
GDE::Map map_;
bool quit_flag_;
};
}
#endif
这样通过整个游戏引擎 可以调度所有状态,状态又反馈给引擎需要调度的新状态,实现整个状态机。
very simple,isn't it?