本着简单,易用的设计原则
我给盖莫引擎加入了一个简单的插件系统
插件基类如下:
class Plugin : public virtual RefCount
{
public:
virtual ~Plugin(){}
virtual PLUGIN_FORMAT GetFormat()const = 0;
virtual engine_string GetMaker()const = 0;
virtual engine_string GetDescription()const = 0;
virtual void GetVersion(int &main,int &sub,int &pitch) = 0;
private:
virtual bool Init(void* data) = 0;
virtual void Deinit(void* data) = 0;
friend class PluginFactory;
};
可以看出基本的插件方法有获取插件格式,插件作者,插件描述,插件版本等
下面的是简单的插件工厂
////////////////////////////////////////////////////////////
/// 定义引擎插件工厂(管理器)
////////////////////////////////////////////////////////////
class GAPI PluginFactory : public Singleton<PluginFactory>
{
public:
bool RegisterPlugin(Plugin* plugin);
void UnRegisterPlugin(Plugin* plugin);
};
这是一个简单的单件
它只有2个函数注册和反注册插件
使用的时候只要获取插件指针
然后传入插件工厂注册之后即可使用
(注册的本质就是根据插件类型设置必要的插件上下文数据)
这种插件方法有它的弊端 不过在我看来最大的好处就是简单咯
下面是简单的视频播放插件咯
////////////////////////////////////////////////////////////
/// 定义引擎视频播放器(全局唯一)
////////////////////////////////////////////////////////////
class VideoPlayer : public Plugin
{
public:
///////////////////////////////////////////////////////
/// 构造,析构视频播放器
///////////////////////////////////////////////////////
VideoPlayer(){}
virtual ~VideoPlayer(){}
///////////////////////////////////////////////////////
/// 播放指定视频
///////////////////////////////////////////////////////
virtual bool Play(const engine_string& video) = 0;
///////////////////////////////////////////////////////
/// 视频更新每帧调用
///////////////////////////////////////////////////////
virtual bool Update() = 0;
///////////////////////////////////////////////////////
/// 停止并卸载视频
///////////////////////////////////////////////////////
virtual void Stop() = 0;
///////////////////////////////////////////////////////
/// 获取,设置视频当前音量(0-1)
///////////////////////////////////////////////////////
virtual float GetVolume()const = 0;
virtual void SetVolume(float volume) = 0;
};