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

本文关键字:插件架 XNA 类型 插件 | 更新日期: 2023-09-27 18:04:30

我希望在XNA中为自己设计一个多用途RPG引擎,并希望使其依赖于插件。在很大程度上,我理解整个总体概念……我有一个基本的IPlugin接口。

然而,当您意识到您需要为不同的系统提供几种类型的插件,并找到一种方法来适应它们时,问题就出现了。事实上,你可以说我在尝试让所有东西都被调制。我是否应该使用实现不同功能的多个接口?不同的主机接口?任何提示都很感激。:)

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

这取决于你如何从性能的角度来看待这个问题。但是你可以这样做。 :

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.
}

非常基本的概念。但是在实际实现中肯定会变得更加复杂,并且在实现之后很容易变得更加复杂。保持对复杂性的关注,因为它会影响性能,因为在"最大灵活性"模式下,它很容易被忽略。

问候。

您没有IPlugin接口。你有一个IEnemy接口和一个IWeapon接口等等

你可以使用组件,无论是你自己的或gameComponents,默认情况下是不活动的。然后,您可以自己选择激活哪些文件,例如xml文档。

<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;
        }
    }
}