本著簡單,易用的設計原則
我給蓋莫引擎加入了一個簡單的插件系統
插件基類如下:
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;
};