|
|
本着简单,易用的设计原则
我给盖莫引擎加入了一个简单的插件系统
插件基类如下:
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< luginFactory>
{
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;
}; |
|