Swift: 有没有办法制作一个使用多个对象的 SKAction 序列?

Swift: Is there a way to make an SKAction sequence that uses more than one object?

我有一个生成敌人然后将它们移过屏幕的序列,它基本上是

moveAndRemoveEnemy = SKAction.sequence([moveEnemy, removeEnemy]) 
enemy.runAction(moveAndRemoveEnemy)

问题是我想在序列中添加另一个动作,在敌人被移除后更新分数。我尝试制作一个单独的方法来增加分数,将其称为 SKAction.runBlock() 并将其插入到序列中,如

let updateScore = SKAction.runBlock { self.increaseScore() }
moveAndRemoveEnemy = SKAction.sequence([moveEnemy, removeEnemy, updateScore])
enemy.runAction(moveAndRemoveEnemy)

但这不起作用。我认为它不起作用的原因是因为需要使用 "self" 调用该方法,如

self.runAction(increaseScore) 

我试过将敌人的生成和移动放到一个单独的方法中,然后使用

self.runAction(moveAndRemoveEnemy)

但这会导致问题自行逆转,因此 updateScore 有效,但敌人不会生成。不幸的是,我尝试了其他增加分数的方法,它们确实有效了一段时间,但根据我的游戏设置,它们最终会随着关卡变得更难而失效。有谁知道解决这个问题的方法吗?任何帮助深表感谢。

你可以看看SKNode的runAction:completion:方法。这将在操作完成后调用 completion()

或者,在 Swift 中:runAction(_ action: SKAction!, completion block: (() -> Void)!)

如果removeEnemy从场景中移除enemy,动作将停止,因为正在执行动作的节点必须在场景中才能继续运行 动作。如果将序列的顺序更改为 [moveEnemy, updateScore, removeEnemy],将调用 updateScore

对于那些感兴趣的人,最终的解决方案是:

enemy.runAction(moveAndRemoveEnemy, completion: {self.runAction(updateScore)})