有几个可能感兴趣的 SKAction 类方法。第一个是 runBlock:,第二个是 group: (这允许操作并行运行)。
您可以使用完成处理程序在节点上运行操作 runAction: completion:
以下代码将每个“动画动作”连同完成块放在一个“块动作”中。然后将阻止操作放入 “组操作”。最后,组动作被告知运行。这会导致每个阻止操作同时开始。每个块操作的完成处理程序调用一个名为 checkCompletion 的方法。此方法通过在节点上调用 hasActions 来检查节点 (具有特定名称属性值) 是否仍在动画。因为调用checkCompletion方法的节点会返回YES,如果只有一个节点返回YES,那么所有动画都完成了。
以下使用两个节点演示了这一点,但它可以用于两个以上。
// assuming two SKNode subclasses named 'node1' and 'node2' AND 'self' is an SKScene subclass
// assign each animating node the same name (used in checkCompletion method)
node1.name = @"animating";
node2.name = @"animating";
// in this example both nodes will animate to the origin
CGPoint origin = CGPointMake(0.0, 0.0);
// make move actions for nodes
SKAction *shortMove = [SKAction moveTo:origin duration:1.2];
SKAction *longMove = [SKAction moveTo:origin duration:4.8];
// wrap nodes in their own separate block action
SKAction *moveNode1 = [SKAction runBlock:^{
[node1 runAction:shortMove completion:^{
NSLog(@"shortMove complete");
[self checkCompletion];
}];
}];
SKAction *moveNode2 = [SKAction runBlock:^{
[node2 runAction:longMove completion:^{
NSLog(@"longMove complete");
[self checkCompletion];
}];
}];
// put block actions in a group action
SKAction *groupAction = [SKAction group:@[moveNode1, moveNode2]];
// execute group action
[self runAction:groupAction];
checkCompletion 方法-
- (void)checkCompletion {
__block int currentlyHasActions = 0;
// check for all actions complete on animating nodes
[self enumerateChildNodesWithName:@"animating" usingBlock:^(SKNode *node, BOOL *stop){
if ([node hasActions]) {
currentlyHasActions++;
// prevent unnecessary enumeration
if (currentlyHasActions > 1) { *stop = YES; }
}
}];
if (currentlyHasActions == 1) {
NSLog(@"Actions Finished!!!");
// execute completion code here...
}
}
不幸的是,以下内容将不起作用,因为阻止操作的持续时间是瞬时的。因此,在这种情况下,集体行动的持续时间也是瞬时的。这就是 checkCompletion 方法的原因。
[self runAction:groupAction completion:^{
// completion code here... :(
}];