1

我的 Enemy 类有几个方法,例如walkAnimationand 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:removeFromParentwaitForDurationflashRed

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

4

1 回答 1

0

您在这里使用的顺序错误,它实际上会妨碍您。

获取名为 Sprite 的子节点。使用完成处理程序在其上运行闪烁的红色动作,该处理程序反过来通过使用 removeFromParent 方法而不是同名动作来删除精灵(或精灵的父级)。

于 2014-01-10T08:05:09.203 回答