我的应用程序是一款具有应用程序状态保存和恢复功能的 SpriteKit 游戏。当保留应用程序状态时,我当前 SKScene
中的大部分节点都已编码。
当运行 SKAction
的节点被编码和解码时, Action 将从头开始。这似乎是标准的 SpriteKit
行为。
对我来说,这种行为对于 SKAction sequence
最为明显。在解码时,序列重新开始,不管它的组件 Action 有多少已经完成。例如,假设运行序列的代码如下所示:
[self runAction:[SKAction sequence:@[ [SKAction fadeOutWithDuration:1.0],
[SKAction fadeInWithDuration:1.0],
[SKAction waitForDuration:10.0],
[SKAction removeFromParent] ]]];
如果在 10 秒等待期间保留应用程序状态,然后恢复,SKAction
序列将再次从头开始,并带有第二次可见的淡出和淡入。
SKAction sequence
应该显示与其他 Action 一致的解码行为是有道理的。不过,创建一个异常(exception)是很有用的,这样任何已经完成的操作都不会再次运行。如何防止序列在解码后重新启动?
最佳答案
我能想到的实现您想要实现的目标的唯一方法如下。
- 当您启动 Action 时,将时间存储在一个变量中。请记住,您需要使用更新函数中传递的“currentTime”值。
- 当您需要编码时,计算从创建 Action 到编码之间经过了多少时间。
从那里您有两个选择,保存剩余时间以及何时重新创建操作,将其用于您的计算或根据剩余时间创建新操作并对其进行编码。
我不认为 SKActions 真的打算以这种方式使用,但这至少是一种变通方法。我认为开发人员更常见的做法是存储他们游戏的“状态”以保持持久性,而不是尝试存储实际的 Sprite 和 Action 。 UIKit 的东西也是一样的。您不会存储 UIViews 以实现持久性,而是会有一些其他对象包含根据用户进度重新创建的信息。希望其中一些至少有一点帮助。祝你好运。
编辑
为了提供更多关于“理论上”我会如何处理这个问题的信息,你是对的,这很麻烦。
- 子类 SKSpriteNode
- 创建一个新方法来在该 Sprite 上运行 Action (例如 -(void)startAction:withKey:duration:),最终将调用带键的运行 Action 。
- 当调用 startAction 时,您将其存储到某种 MutableArray 中,其中包含一个字典,该字典存储该操作、它的键、持续时间和开始时间(默认为 0)。您甚至可能不必实际存储该操作,只需存储 key 、持续时间和开始时间。
- 在这个 SKSpriteNode 子类上添加一个 update: 方法。您调用其更新的每个更新循环并检查 1 是否有任何操作没有开始时间,以及 2 是否这些操作仍在运行。如果没有开始时间,则将当前时间添加为开始时间,如果未运行,则将其从数组中删除。
- 当您编码/保存该 Sprite 时,您使用该数组中的信息来确定这些 SKAction 的状态。
在此示例中,重点在于每个 SKSpriteNode 都持有并跟踪其自己的 SKAction。抱歉,我没有时间在 Objective-C 中浏览和编写代码。同样,我绝不是在声称或试图暗示这比您的回答更好或更差,而是要解决如果我决定按照您的问题保存 SKActions 的状态,我将如何处理这个问题。 =)
关于ios - 如何防止 SKAction 序列在解码后重新启动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36293846/