【问题标题】:Plugin architecture with multple plugin types (XNA)具有多种插件类型的插件架构 (XNA)
【发布时间】:2011-08-03 19:00:50
【问题描述】:

我希望在 XNA 中为自己设计一个多功能 RPG 引擎,并希望使其依赖于插件。在大多数情况下,我了解整个一般概念......并且我有一个基本的 IPlugin 界面。

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

【问题讨论】:

  • 你能举一个你面临的问题的例子吗?
  • 或多或少的设计。战斗系统插件所需的服务将与菜单系统不同,但同样有多种类型的菜单。战斗系统可能需要连接一些东西来创建窗口。使用某种脚本系统会更好吗?我需要多个插件接口和主机吗?

标签: c# architecture plugins xna


【解决方案1】:

取决于您将如何管理以及从性能角度看待这一点。但是你可以做这样的事情。 伪代码

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】:

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

    【讨论】:

    • 对插件有什么帮助?我想说的是——换掉一个战斗系统,保留任何给定系统需要访问的核心组件。
    【解决方案3】:

    您可以使用默认不活动的组件,无论是您自己的还是游戏组件。 然后您可以自己选择要激活的文件,例如 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;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-02
      • 2011-05-24
      • 1970-01-01
      • 1970-01-01
      • 2021-09-11
      • 1970-01-01
      相关资源
      最近更新 更多