我的 Enemy 类有几个方法,例如walkAnimation
and deathAnimation
,它们返回 SKAction 的实例。因为这些 SKActions 涉及在 Enemy 节点的许多子节点上协调基本操作,runAction:onChildWithName:
似乎是管理这个的方法。
但是,根据文档(和实验),SKAction -runAction:onChildWithName:
是瞬时的。这意味着如果这样的动作出现在序列中,下一个动作将立即触发,而不是等待该子动作完成。同样,如果有一个完成处理程序,它将立即被调用。如此有效,runAction:onChildWithName:
无非是一个runBlock:
动作的捷径,就像removeFromParent
是一样。
作为我面临的问题的一个具体例子,假设我有一个复合死亡动画。支持我的敌人的精灵闪烁红色,然后敌人本身从场景中移除。我不能colorizeWithColor:colorBlendFactor:duration:
直接对我的 Enemy 使用,因为该操作仅对 SKSpriteNode 实例有效。我不能removeFromParent
在 Enemy 的 Sprite 节点上使用,因为这不会完全从场景中移除这个 Enemy 实例。所以runAction:onChildWithName:
是需要的。
-(SKAction *)deathAnimation {
SKAction *flashRed = [SKAction colorizeWithColor:[UIColor redColor] colorBlendFactor:1.0 duration:0.2];
return [SKAction sequence:@[
[SKAction runAction:flashRed onChildWithName:@"Sprite"],
[SKAction removeFromParent],
]];
}
当我运行这个 SKAction 时,我的 Enemy 节点会立即消失,而不会闪烁红色。原因是runAction:onChildWithName:
没有持续时间。它的持续时间是瞬间的。同样,如果我的 SKScene 使用,将立即调用该完成块。0.2
[enemy runAction:[enemy deathAnimation] completion:^{ ... }];
我不想改用较小的设计。我的 Enemy 类返回SKAction
实例,让 SKScene 精确控制这些动作的协调和组合。对此的一个重要方面是通知此类操作的完成。runAction:onChildWithName:
肯定达不到那个标准。
一个 hacky 解决方案是在和[SKAction waitForDuration:0.2]
之间的序列中包含 a 。但这并不理想。和动作是否有可能在运行循环的不同迭代中完成?对于这种情况,这并不重要,但是一旦您使用多个完成处理程序涉及多个操作,我担心可能会导致竞争条件。runAction:onChildWithName:
removeFromParent
waitForDuration
flashRed
除了我还有其他选择waitForDuration:
吗?