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

时间:2015-08-13 21:56:55

标签: swift sprite-kit sequence skaction

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

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可以正常工作,但敌人不会产生。不幸的是,我尝试了其他方法来提高分数,并且他们确实工作了一段时间,但根据我的游戏设置方式,他们最终会随着关卡变得更难而崩溃。有没有人知道这方面的任何方法?任何帮助深表感谢。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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