Архитектура плагинов с несколькими типами плагинов (XNA) - PullRequest
0 голосов
/ 03 августа 2011

Я хочу разработать для себя многоцелевой RPG-движок в XNA и хотел бы, чтобы он зависел от плагинов. По большей части я понимаю всю общую концепцию ... и у меня есть базовый интерфейс IPlugin.

Однако проблема возникает, когда вы понимаете, что вам нужно несколько типов плагинов для разных систем и способ приспособиться ко всем этим. На самом деле, можно сказать, что я пытаюсь сделать все модулированным. Должен ли я использовать несколько интерфейсов, которые реализуют разные вещи? Разные хост-интерфейсы? Любые советы приветствуются. :)

Ответы [ 3 ]

0 голосов
/ 04 августа 2011

Зависит от того, как вы собираетесь управлять, а также с точки зрения производительности на этом.Но вы можете сделать что-то вроде этого. Псевдокод :

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

Очень простая идея.Но это наверняка станет более сложным в реальной реализации и может легко усложниться после.Обратите внимание на сложность, так как она влияет на производительность, потому что ее легко пропустить по шаблону «максимальной гибкости».

С уважением.

0 голосов
/ 12 августа 2011

Вы можете использовать компоненты, собственные или 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;
        }
    }
}
0 голосов
/ 03 августа 2011

У вас нет интерфейса IPlugin.У вас есть IEnemy интерфейс и IWeapon интерфейс и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...