2013-02-28 93 views
1

我一直试图在上周解决这个问题,并且似乎无法找到一个既不需要单例也不需要紧耦合的解决方案。 我正在开发一个3D空间游戏,其中的早期演示是在这里...
www.sugarspook.com/darkmatters/demo.html
...我正在开始添加任务玩家将能够从抬头显示器(Hud class)中进行选择。如何避免紧耦合?

游戏的结构是:
Game类包含Hud和ObjectsList类。
ObjectsList类包含各种游戏对象,包括玩家,各种船舶,行星和轨道(空间站)。
当玩家进入轨道的某个距离内时,任务被实例化。
任务被添加到一个MissionsList类中,它本身在ObjectsList中。
任务可能变得不可用,并且在没有警告的情况下过期(就像他们被另一个飞行员选中一样),因此Hud上显示的列表是动态的并且会定期更新。
此前我有任务派遣事件直到游戏,这反过来告诉Hud的变化。这对我来说似乎有点笨拙,因为Hud有各种更深层次的信息需要传递给它。我最终在整个连锁过程中拥有许多相同的功能。

我正在考虑的解决方案是将对MissionsList类的引用注入Hud,使其能够侦听Missonslist的更新。我听说把事情的状态和它的显示混合起来是不好的做法,但是我不知道如何让“活”的任务清单到达Hud。相比之下,如果Hud仅包含显示细节而不参考生成这些细节的任务对象,则当玩家从Hud选择任务时,如何确定选择了哪个任务? 在这种情况下紧耦合是否正常?或者我应该使用单身人士与Hud沟通? 如果我所建议的任何事情都有根本性的错误,欢迎告诉我什么是什么,什么是最好的解决方案。 谢谢。

回答

0

那么简单的答案是为什么不通过中间接口连接?

interface IMissionList 
{ 
    ObservableCollection<IMission> Missions{get;} 
} 

然后在你的依赖注入绑定,要的东西,可以解析为实例,单身或恒定或等..

然后把它注射到你的铁汉的构造

Hud(IMissionList missionList){} 

现在你松散地与合同相关联,执行 - 只要执行遵守合同,就可以随时更改。而且,由于注入,你的Hud只需要使用IMissionList来关注它自己而不是发现它。

[编辑]抱歉,这是C#,但希望这个想法是有用的。 See for actionscript interfacesDependency Injection for Actionscript

+0

感谢您的回复。这听起来很有用,但我不太喜欢'在你的DI ...'部分,对不起。这对一些人来说可能是显而易见的,但'DI'是什么?谢谢。 – moosefetcher 2013-02-28 15:12:52

+0

依赖注入。一旦你获得了灯泡的时刻,它真的很棒。 Google:控制反转。 Actionscript DI:http://www.adobe.com/devnet/flex/articles/dependency_injection.html – 2013-02-28 15:17:10

+0

再次感谢。我记得前一段时间读到的。看起来我有更多的阅读要做。 – moosefetcher 2013-02-28 15:37:30