一个简单的游戏引擎核心状态机的C++实现

这个是我之前做的一个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?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值