首页 文章

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

提问于
浏览
1

我的敌人类有几种方法,e.g. 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 解决方案是在runAction:onChildWithName:removeFromParent之间的序列中包含[SKAction waitForDuration:0.2]。但这并不理想。 waitForDurationflashRed动作是否有可能在运行循环的不同迭代中完成?这对于这种情况并不重要,但只要您涉及多个完成处理程序的多个操作,我就会担心竞争条件可能会导致。

除了waitForDuration:之外我还有其他选择吗?

1 回答

  • 0

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

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

相关问题