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

电脑杂谈  发布时间:2020-06-03 22:15:23  来源:网络整理

简单的游戏引擎_unity3d引擎的游戏_a3引擎游戏

众所周知简单的游戏引擎,对于游戏(或应用程序),我们可以将界面的每个部分划分为不同的状态,然后整个系统过程就是一个有限状态机.

我在这里的工作是实现此状态机框架和特定的调度过程.

简单的游戏引擎_unity3d引擎的游戏_a3引擎游戏

主要游戏引擎类的头文件

/*
 * 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

unity3d引擎的游戏_简单的游戏引擎_a3引擎游戏

实施代码的核心部分

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;
		}
	}
}

a3引擎游戏_unity3d引擎的游戏_简单的游戏引擎

对于每个状态处理器,我定义一个基类,该基类必须实现状态处理过程并反馈给游戏引擎以处理结果.

GDE_GameEngineHelper如下定义

unity3d引擎的游戏_简单的游戏引擎_a3引擎游戏

/*
 * 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

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      • 刘骏
        刘骏

        不然堂堂十四亿大国该何去何从

      • 李承锦
        李承锦

        更新完游戏都进不了

      热点图片
      拼命载入中...