ios - 如何防止 SKAction 序列在解码后重新启动?

标签 ios sprite-kit skaction uikit-state-preservation

我的应用程序是一款具有应用程序状态保存和恢复功能的 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)是很有用的,这样任何已经完成的操作都不会再次运行。如何防止序列在解码后重新启动?

最佳答案

我能想到的实现您想要实现的目标的唯一方法如下。

  1. 当您启动 Action 时,将时间存储在一个变量中。请记住,您需要使用更新函数中传递的“currentTime”值。
  2. 当您需要编码时,计算从创建 Action 到编码之间经过了多少时间。

从那里您有两个选择,保存剩余时间以及何时重新创建操作,将其用于您的计算或根据剩余时间创建新操作并对其进行编码。

我不认为 SKActions 真的打算以这种方式使用,但这至少是一种变通方法。我认为开发人员更常见的做法是存储他们游戏的“状态”以保持持久性,而不是尝试存储实际的 Sprite 和 Action 。 UIKit 的东西也是一样的。您不会存储 UIViews 以实现持久性,而是会有一些其他对象包含根据用户进度重新创建的信息。希望其中一些至少有一点帮助。祝你好运。

编辑

为了提供更多关于“理论上”我会如何处理这个问题的信息,你是对的,这很麻烦。

  1. 子类 SKSpriteNode
  2. 创建一个新方法来在该 Sprite 上运行 Action (例如 -(void)startAction:withKey:duration:),最终将调用带键的运行 Action 。
  3. 当调用 startAction 时,您将其存储到某种 MutableArray 中,其中包含一个字典,该字典存储该操作、它的键、持续时间和开始时间(默认为 0)。您甚至可能不必实际存储该操作,只需存储 key 、持续时间和开始时间。
  4. 在这个 SKSpriteNode 子类上添加一个 update: 方法。您调用其更新的每个更新循环并检查 1 是否有任何操作没有开始时间,以及 2 是否这些操作仍在运行。如果没有开始时间,则将当前时间添加为开始时间,如果未运行,则将其从数组中删除。
  5. 当您编码/保存该 Sprite 时,您使用该数组中的信息来确定这些 SKAction 的状态。

在此示例中,重点在于每个 SKSpriteNode 都持有并跟踪其自己的 SKAction。抱歉,我没有时间在 Objective-C 中浏览和编写代码。同样,我绝不是在声称或试图暗示这比您的回答更好或更差,而是要解决如果我决定按照您的问题保存 SKActions 的状态,我将如何处理这个问题。 =)

关于ios - 如何防止 SKAction 序列在解码后重新启动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36293846/

相关文章:

ios - 如何等到 uiimageview 在 objective-c 中调整大小

swift - 在 Sprite 套件上写入字符串

ios - SKSpriteNode 不会居中

ios - 使用 block 中访问 self 的方法是否安全

ios - 使用 iTunes Store 客户评论 API

iOS 相当于 [NSColor colorUsingColorSpaceName :NSCalibratedRGBColorSpace]

swift - 如何随着时间的推移或分数更新时增加重力?

swift - 是否可以在不是 SKAction 的 SKAction 序列中运行代码?

ios - SKAction 方法 fadeInWithDuration 不工作

Swift:改变 moveTo SKAction 的速度