我有以下代码:
-(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
动作,直到对象完成移动。目前,似乎输出立即运行所有操作,并且不会像它应该那样对它们进行排序。我已阅读文档,我现在所拥有的是他们所说的......
答案 0 :(得分:4)
runBlock:
操作是一次性操作。它只运行一次块,然后立即“结束”。
你想要的是行动不是为了处理而设计的。它们运行一次,或者运行一段时间(持续时间)。但是,它们不会在满足某些任意条件之前运行 - 这可能是立即成立的,最终可能成为现实或可能永远不会成为现实。这种方式使所有可变定时特征动作都能够无效(即线性与易于缩放时间)。
您可以做的是将“moveToSpriteNode”移动作为动作发出,并单独检查更新方法是否精灵到达节点。如果是这样,您将运行下一个移动动作(不使用序列)。
更容易,您可以简单地依靠移动操作来结束精灵已到达目标节点。然后,这将触发序列中的下一个移动动作。如果要在每个目标上运行完成块,只需在完成块内安排下一个移动操作。