ios - Sprite-kit 游戏生命周期、属性和全局变量?

标签 ios swift sprite-kit

在我的 sprite-Kit 游戏中,我的游戏经历了各种场景,我希望在这些场景中某些变量可用。见下图:

enter image description here

所以标题屏幕加载了主游戏屏幕。当“波”结束时(所有目标完成或所有生命丢失),结束场景会显示一些统计数据。然后,如果玩家还剩生命,则再次加载主游戏,如果没有,则再次显示标题屏幕。

我希望玩家的分数和剩余生命数在主游戏场景和最终场景中可用;应该在所有场景中保持高分。

我为这些使用全局变量,而我的大多数变量是在类下定义的属性。

我第一次必须这样做(对于我添加高分或多条生命之前的 score 属性)我在每个场景中使用了一个 score 属性,并在我为下一个场景做 presentScene 时在场景之间传递它,但这看起来很笨拙,尤其是当我不得不添加更多变量时。

是否有最佳实践,即是否应该使用/不使用全局变量,如果没有,是否有正确的方法来处理属性,可能由您初始化它们的位置控制,例如在 initdidMoveToView 相比,这决定了当场景再次显示时它们是否重新初始化?

编辑:

当我从 End Wave 场景返回导致主屏幕再次重新初始化的主游戏屏幕时,我是否做错了什么?有没有办法保留它(及其所有属性),因此它没有完全重新初始化,但它再次调用了 didMoveToView?

最佳答案

一般经验法则:如果您可以避免使用全局变量,请这样做。

现在每个节点都有一个名为 userData 的可变字典。 .这旨在用于将数据保存到节点。

创建新场景后,从旧场景传输您需要的任何数据。

let scene = SKScene(fileNamed:....)
scene.userData["highscore"] = self.highscore
view.presentScene(scene)

现在在新场景didMove(view:)方法,你读了说userData
正如 0x141E 所指出的,记住你需要初始化 userData ,因为您可能有一个自定义类,所以您可以在您的 init 方法中执行此操作,只需记住覆盖所有指定的 init,以便您可以访问方便的方法。

另外,正如 Whirlwind 和我自己之间的评论中提到的,SKNodeNSCoding合规,所以当你去保存你的信息时,你可以保存SKNode整体和userData将随之而来。

这意味着您所要做的就是为 SKNode 编写一个扩展程序。保存/加载节点,这样就不必担心管理另一个类。

关于ios - Sprite-kit 游戏生命周期、属性和全局变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39657992/

相关文章:

swift - SKAction 的行为似乎不像我预期的那样

ios - UISearchBar 上方的线

ios - 图片下载间歇性

ios - 将数据保存在特定用户 ID iOS - Alamofire、Json 中

ios - Alamofire:支持上传包含文本和文件部分的多部分表单吗?

sprite-kit - Sprite 套件的方向键

ios - 使用 SpriteKit 检测 Sprite 边界框(alpha 蒙版)内的触摸

ios - 如何在ios应用程序中正确弹出 View ?

ios - 如何声明实现多个协议(protocol)的参数

ios - 推送到 tabBar 时隐藏 View - swift