2011-08-03 49 views
0

私はXNAで自分用に多目的RPGエンジンを設計しようとしており、プラグインに依存したいと考えています。ほとんどの場合、私は一般的な概念全体を理解しています...そして、私は基本的なIPluginインタフェースを持っています。マルチプルプラグインタイプ(XNA)のプラグインアーキテクチャ

しかし、問題は、異なるシステム用のいくつかのタイプのプラグインが必要であり、それをすべて収容する方法が必要であることがわかったときに発生します。実際には、私はすべてを調整するように努力していると言うことができます。異なるものを実装する複数のインターフェイスを使用する必要がありますか?異なるホストインターフェイスですか?任意のヒントが評価されます。 :)

+0

をあなたが直面している問題の例を与えることができますか? – Tigran

+0

多かれ少なかれデザイン。バトルシステムのプラグインが必要とするサービスは、メニューシステムとは異なりますが、メニューには複数の種類があります。また、戦闘システムでは、ウィンドウを作成するために何かにフックする必要があるかもしれません。何らかのスクリプティングシステムを使うのがよいでしょうか?複数のプラグインインターフェイスとホストが必要ですか? –

+0

私の返事を見る – Tigran

答えて

0

どのように管理し、これについてもパフォーマンスの観点から見ます。このようなことをすることができます。 擬似コード

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

IPluginインターフェイスがありません。あなたはIEnemyインターフェイスとIWeaponインターフェイスなどを持っています。

+1

プラグインはどのように役立つのですか?私は言うことができるようにしたい - 特定のシステムがアクセスする必要がありますコアコンポーネントを維持して戦闘システムを交換します。 –

0

独自のコンポーネントまたは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; 
     } 
    } 
} 
関連する問題