ios - 处理 iOS 游戏和应用程序中的层次结构破坏效果

标签 ios architecture hierarchy paradigms

大约一年半前,我开始从事 iOS 开发人员的工作,但我在软件架构和组织方面遇到了一些麻烦。我使用 Apple 推荐的模型- View - Controller 范例,我的代码通常非常分层:如果一个屏幕有(例如)一个 HUD、一个控制面板和一个显示区域,我有一个屏幕的主 Controller 和子 Controller HUD、控制面板和显示区域的 Controller 。子 Controller 通常不知道其相邻 Controller ,并使用主 Controller 中的方法与它们进行交互。

但是,尤其是在游戏中,我经常遇到这种模型无法优雅解决的层次结构破坏问题。例如,假设我在控制面板区域有一枚硬币,我想为它制作飞向 HUD 的动画。我可以将原始硬币设置为新位置的动画,这需要控制面板子 Controller 中的 animateCoinToPosition: 方法和主 Controller 中的 getPositionForFinalCoinPositionInHUD 方法;或者,我可以隐藏原始硬币并在主 Controller 或 HUD Controller 中创建一个复制硬币,这需要一个像 animateCoinToHUDFromStartingPosition: 这样的委托(delegate)方法。我不喜欢在我的 Controller 中使用这种奇怪的特定方法,因为它们只真正存在以解决一个问题,并且还暴露了层次结构。我理想的解决方案是使用一个名为 animateCoinToHUD 的方法,但这需要展平整个层次结构并将三个 Controller 合并为一个,这显然不值得。 (或者让子 Controller 访问它们的兄弟——但这基本上会产生相同的效果。子 Controller 将相互依赖,创建一个单一的凌乱的蜘蛛网 Controller 而不是主 Controller 和三个大部分独立的子 Controller 。 Controller 。)

而且情况往往会变得更糟。如果我想在移动硬币时显示全屏动画或粒子效果怎么办?如果我的硬币比一个简单的 Sprite 复杂得多,有很多 subview 和细节,以至于使用 animateCoinToHUDFromStartingPosition: 创建复制硬币效率低下怎么办?如果硬币飞到 HUD 但随后返回到控制面板怎么办?我是否将硬币 View “借给”主 Controller ,然后在动画完成时将其取回,同时保留原始位置/z 顺序/等。在临时变量中以便可以恢复它们?还有一件事:从逻辑上讲,涉及多个子 Controller 的代码属于主 Controller ,但如果这些交互很常见,主 Controller 就会增长到数千行——我在许多项目中都看到过这种情况,而不仅仅是我自己的。

是否有一种一致的方法来处理这些打破层次结构的效果和 Action ,不需要重复的代码或 Assets ,不会让我的 Controller 膨胀,并且优雅地允许我在子 Controller 之间共享对象?还是我完全使用了错误的方法?

最佳答案

因此,我认为您对“永不上升”层次结构的理解可能过于字面意思了。

我认为这个想法是您具体不知道父对象是什么,但是您可以定义一个协议(protocol)并且知道无论您的父对象是什么它都会响应所述协议(protocol)。您最好在代码中进行测试以确认它响应该协议(protocol)。然后使用该协议(protocol)以通用方式发送消息,其中您将硬币对象传递给父对象并让父对象将其设置为动画离开屏幕并进入 HUD。

然后子 Controller 有一个 id<parent_protocol> parent;实例变量及其初始化方法将其中一个作为参数。根据您的描述,您已经有了这样的东西,或者至少足以实现“子 Controller 通常不知道其相邻 Controller 并使用主 Controller 中的方法与它们交互”,正如您所说。

所以从设计的角度来看,这个想法是硬币拾取发生在显示面板中,它所知道的是它的父对象有一个 pickupCoin:。方法将对捡起的硬币做任何适当的。显示面板不知道它进入 HUD 或其他什么,只是拾取的硬币由父 Controller 的 pickupCoin: 处理。方法。

这里的 OOP 设计理念是父级的所有知识都封装在协议(protocol)定义中。这使得子级和父级的耦合更加松散,因此您可以交换实现该协议(protocol)的任何父级,而子级仍然可以正常工作。

您可以使用更松散的耦合(例如全局发布的通知),但在您描述的情况下,我认为像我概述的那样可能更合适并且可能更高效。

这有帮助吗?

关于ios - 处理 iOS 游戏和应用程序中的层次结构破坏效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12306503/

相关文章:

ruby-on-rails - 使用 EBC 的架构的实际示例?

sql-server - 在 Ancestor 表中插入数据并从 Ancestor 表中检索数据

iOS:放大/缩小动画以显示 UIView

ios - Xcode 8 beta 6 中的模糊错误

c++ - 这两种线程方法有什么区别?

architecture - HBase 反模式

python - python对象可以有嵌套属性吗?

c++ - 使用什么设计模式?

ios - 如果我在 Realm 上创建数据库,我的用户是否可以在没有互联网访问权限的情况下访问它?

iphone - NSMutableArray 的最小值和最大值