我的敌人类有几种方法,例如walkAnimation
和deathAnimation
,返回SKAction的实例。因为这些SKActions涉及协调Enemy节点的许多子节点上的基本操作,runAction:onChildWithName:
似乎是管理它的方法。
但是,根据文档(以及实验),SKAction -runAction:onChildWithName:
是即时的。这意味着如果序列中存在此类操作,则下一个操作将立即触发,而不是等待该子操作完成。同样,如果有完成处理程序,则会立即调用。如此有效,runAction:onChildWithName:
只不过是runBlock:
操作的快捷方式,就像removeFromParent
一样。
作为我面临的问题的一个具体例子,我说我有一个复合死亡动画。支持我的敌人的精灵闪烁红色,然后敌人本身从场景中移除。我不能直接在我的Enemy上使用colorizeWithColor:colorBlendFactor:duration:
,因为该操作仅对SKSpriteNode实例起作用。我无法在Enemy的Sprite节点上使用removeFromParent
,因为这不会从场景中完全删除此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:
不的持续时间为0.2
。它的持续时间很快。同样,如果我的SKScene使用[enemy runAction:[enemy deathAnimation] completion:^{ ... }];
,则会立即调用该完成块。
我不想改用较小的设计。我的Enemy类返回SKAction
个实例,使SKScene能够精确控制这些操作的协调和组合。这方面的一个重要方面是通知完成此类行动。 runAction:onChildWithName:
当然不符合该标准。
一个hacky解决方案是在[SKAction waitForDuration:0.2]
和runAction:onChildWithName:
之间的序列中加入removeFromParent
。但这并不理想。 waitForDuration
和flashRed
动作是否有可能在运行循环的不同迭代中完成?这对于这种情况并不重要,但只要您涉及多个完成处理程序的多个操作,我就会担心竞争条件可能会导致。
waitForDuration:
以外还有其他选项吗?
答案 0 :(得分:0)
你在这里使用了错误的序列,它实际上阻碍了它。
获取名为Sprite的子节点。使用完成处理程序对其运行闪存红色操作,然后使用removeFromParent方法而不是具有相同名称的操作来删除精灵(或精灵的父级)。