我希望在XNA中为自己设计一个多用途的RPG引擎,并希望让它依赖于插件。在大多数情况下,我理解整个概念......我有一个基本的IPlugin接口。
但是,当您意识到需要针对不同系统的多种类型的插件时,以及一种适应所有类型的插件时,就会出现问题。事实上,你可以说我试图让所有东西都被调制。我应该使用多个接口来实现不同的东西吗?不同的主机接口?任何提示都表示赞赏。 :)
答案 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;
}
}
}