具有多种插件类型(XNA)的插件架构

时间:2011-08-03 19:00:50

标签: c# architecture plugins xna

我希望在XNA中为自己设计一个多用途的RPG引擎,并希望让它依赖于插件。在大多数情况下,我理解整个概念......我有一个基本的IPlugin接口。

但是,当您意识到需要针对不同系统的多种类型的插件时,以及一种适应所有类型的插件时,就会出现问题。事实上,你可以说我试图让所有东西都被调制。我应该使用多个接口来实现不同的东西吗?不同的主机接口?任何提示都表示赞赏。 :)

3 个答案:

答案 0 :(得分:0)

您没有IPlugin界面。您有IEnemy界面和IWeapon界面等。

答案 1 :(得分:0)

取决于您将如何管理,并从绩效角度看待这一点。 BUt yu可以做这样的事情。 伪代码

public class Host {

   HostEventDispatcher dispatcher = new HostEventDispatcher ();
   MenuTypes {File, Tools, Options, Help}
   ToolBarTypes {MainBar}

   AddSubMenuToMainMenu(IMenu menu, MenuTypes hostMenu);
   AddSubMenuToMainMenu(IToolbar toolbar, ToolBarTypes hostToolbar);   

   public void LoadPlugin(IPlugin plugin) 
   {
       plugin.Dispatcher = dispatcher;
   }
}

interface IMenu {/* control warpper implementation */} 

interface IToolBar {/* control wrapper implementation */}

public HostEventDispatcher {
   //raises events to subscribers (Host, plugins)

   /***** event list ***/
}

public interface IPlugin 
{
    Dispatcher {get;set} //using this plugin can raise/recieve evets to/from Host.
}

非常基本的想法。但它确实会在真正的实现中变得更加复杂,之后很容易变得更加复杂。注意复杂性因为它会影响性能,因此在“最大灵活性”模式之后很容易错过。

问候。

答案 2 :(得分:0)

您可以使用默认无效的组件,您自己的组件或gameComponents。 然后你可以自己选择激活哪些,例如xml doc。

<Plugins>
  <Plugin name="MyNamespace.CombatManager"/>
  <Plugin name="MyNamespace.GuiManager"/>
</Plugins>

然后你可以激活选定的插件:

using System.Xml.Linq;
public void ActivatePlugins(string filePath)
{
    XElement plugins = XElement.Load(filePath);
    foreach(var plugin in plugins.Elements("Plugin"))
    {
        for(int i = 0; i < Components.Count; i++)
        {
            if(Type.GetType(plugin.Value) == Components[i].GetType()) 
            { ((GameCompoent)Components[i]).Enabled = true; }
            break;
        }
    }
}