
众所周知简单的游戏引擎,对于游戏(或应用程序),我们可以将界面的每个部分划分为不同的状态,然后整个系统过程就是一个有限状态机.
我在这里的工作是实现此状态机框架和特定的调度过程.

主要游戏引擎类的头文件
/*
* 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
通过这种方式,可以通过整个游戏引擎调度所有状态简单的游戏引擎,并将状态反馈到需要调度引擎以实现整个状态机的新状态.
很简单,不是吗?
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-232866-1.html
更新完游戏都进不了
不然堂堂十四亿大国该何去何从