SpriteKit:当动作被移除时运行代码或块?

3

SKNoderun函数可让您在动作完成时运行一个块,但如果通过removeAllActions取消/删除了该动作,该怎么办呢?

取消动作不会调用run函数的完成块。

是否有回调或方法可以在动作被取消/删除时运行代码?


没有我能想到的方法,除非使用自定义的.run和.remove函数。 - Fluidity
为什么要在移除操作时调用代码?出于设计选择,您可能希望实际执行移除的对象调用移除操作,否则您可能会陷入需要移除操作但不运行代码的情况,但却被迫这样做。 - Knight0fDragon
@Knight0fDragon 重置那些被动作修改过属性的节点会更规范。最好能够在取消和完成动作时都调用完成块(类似于 UIView 中的 animateWithDuration)。 - Crashalot
@Crashalot,这应该是导致移除的方法,类似于Simone的答案,只是稍作修改。这是一个复杂的问题需要深思熟虑,这就是为什么我不想直接发一个答案。 - Knight0fDragon
2个回答

2

是的,如果在动作完成之前将其删除,则完成块将不会运行。根据文档:

run(:completion:)方法与run(:)方法相同,但在动作完成后,将调用您的块。仅当动作运行到完成时才调用此回调。如果在动作完成之前删除该动作,则永远不会调用完成处理程序。


抱歉,之前的问题表述不够清晰。:) 是的,如问题所述,完成块不会运行。问题在于,当操作被取消/移除时,如何运行代码或某个块? - Crashalot
哦,好的,明白了。那么在这种情况下,您可能需要查看命名动作。使用命名动作,您可以在调用removeAllActions之前使用action(forKey:)进行检查,以查看特定动作是否正在运行。如果是,则可以在调用removeAllActions之前执行所需的任何操作。 - rmp

1
一种解决方法可能是:
class YourSpriteNode: SKNode {

     func doSometingAtCompletionAction() {
          //all your stuff
     }

     override removeAllActions() {
         super.removeAllActions()
         doSometingAtCompletionAction()
     }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接