6

我有以下代码:

-(void)aggravatedSeek:(SKSpriteNode *)target{
    _isAggravated = YES;

    SKAction *action = [SKAction runBlock:^{
        double randTime = 0.2;
        NSLog(@"%f", randTime);
        [self moveToSpriteNode:target withTimeInterval:randTime];
    }];

    //SKAction *repeatAction = [SKAction repeatAction:action count:6];
    SKAction *rep = [SKAction sequence:@[action, action, action, action, action]]; //Test Sequence

   [self runAction:rep completion:^{
       [self runAction:blackColorAction];
       _isAggravated = NO;

    }];
}

我希望我的行动真正等到前一个行动完成。意思是,我的动作需要排序,以便在对象完成移动之前该rep动作不会重复该动作。action目前,输出似乎立即运行所有操作,并且没有像应有的那样对它们进行排序。我已经阅读了文档,我现在所拥有的是他们所说的......

4

1 回答 1

4

runBlock:动作是一次触发类型的动作。它将只运行一次该块,然后该操作立即“结束”。

你想要的是一些行动不是为了处理而设计的。它们运行一次,或运行一段给定的时间(持续时间)。然而,它们不会运行,直到满足某个任意条件 - 这可能立即为真,可能最终变为真或可能永远不会变为真。这种类型的动作使所有可变时间功能都无效(即线性时间与轻松缩放时间)。

你可以做的是将“moveToSpriteNode”移动作为一个动作发出,并单独在一个更新方法中检查精灵是否已经到达节点。如果是这样,您将运行下一个移动动作(不使用序列)。

更容易的是,您可以简单地依靠移动动作结束,这意味着精灵已经到达目标节点。然后这将触发序列中的下一个移动动作。如果要在每个目标上运行完成块,只需在完成块内安排下一个移动操作。

于 2013-09-28T21:45:11.470 回答