如何与SKAction -runAction同步:onChildWithName:?

时间:2014-01-10 04:05:36

标签: ios objective-c sprite-kit skaction

我的敌人类有几种方法,例如walkAnimationdeathAnimation,返回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。但这并不理想。 waitForDurationflashRed动作是否有可能在运行循环的不同迭代中完成?这对于这种情况并不重要,但只要您涉及多个完成处理程序的多个操作,我就会担心竞争条件可能会导致。

waitForDuration:以外还有其他选项吗?

1 个答案:

答案 0 :(得分:0)

你在这里使用了错误的序列,它实际上阻碍了它。

获取名为Sprite的子节点。使用完成处理程序对其运行闪存红色操作,然后使用removeFromParent方法而不是具有相同名称的操作来删除精灵(或精灵的父级)。