一个简单的游戏引擎核心状态机的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、付费专栏及课程。

余额充值