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