1

我在多个项目中反复遇到过这个问题:我最终得到了需要与该结构外部的对象进行通信的对象(嵌套在结构的深处)。

目前我有一个实例化 Hud 和 ObjectsList 类的 Game 类。
Hud 实例化各种抬头显示面板,这些面板本身实例化包含可见文本字段的较小部分。
ObjectsList 实例化各种游戏对象,包括 Player 类。
为了让玩家与特定的 Hud 面板进行通信,我目前需要触发一系列自定义事件,一直到 Game,然后让游戏调用 Hud 上的方法,该方法调用适当的 Hud 面板上的方法。
这似乎相当笨重且效率低下。我可以向 Player 传递对 Hud 的引用,因为可以说 Player 'has-as' Hud。但这是紧耦合吗?而且,鉴于我不希望在其他地方重用此代码,这有关系吗?
我还可以使用观察者模式并注册 Hud 面板来监听来自 Player 的更新,但是,当 Game 无法立即访问 Player 和 hud 面板时,这在哪里进行管理?
还是应该所有的实例化都发生在游戏中,然后结构“组合”?

我很想知道是否有什么我不明白的东西导致这些看似笨重的嵌套结构出现,或者它们是否只是一个必要的副产品。
如果我建议的结构有任何根本性的错误,我会很高兴知道实际的替代方案是什么(最好使用通俗易懂的语言,因为我是一名自学成才的编码员)。
干杯。

4

1 回答 1

0

假设玩家收集了一些硬币,您需要更新 HUD 中的某些内容以反映硬币的数量。

您无法逃避这是一个特定问题的事实,并且除非您花费大量时间开发一个动态的哥特式解决方案来解决您所有的沟通问题并制作早餐,否则该逻辑不会完全可重用。

但是您可以做的是,使用许多不同的 OO 模式(组合等)尽可能多地将此逻辑与可重用类(即: Player、 )分离。HudLabel

个人对这个问题的主观解决方案是在类中拥有基本的通用逻辑Player,并使用一个子类来扩展它,就像CoinGamePlayer所有项目特定逻辑所在的位置一样。然后使用组合引用一个中央通信器类。这也适用于 a GoldCoinHudLabel

作为旁注,看一下 Signals 框架。迄今为止最适合 AS3 项目的活动解决方案:

https://github.com/robertpenner/as3-signals

http://www.developria.com/2010/10/an-introduction-to-as3-signals.html

于 2013-07-12T18:54:35.697 回答