如何一起animation多个SKSpriteNode?

我对SpriteKit很新。 我有一组节点,需要一起移动到每个节点的不同点,然后完成所有animation的animation,我想做点别的。

我以前用UIView组件做这个。 [UIView animateWithDuration:completion:]块提供了我需要的东西。 但是在SpriteKit每个节点都有其自己的动作和animation。 我找不到任何精灵节点的块animation。 所以我无法控制animation完成。

希望,我很清楚。 提前致谢。

有几个SKAction类的方法可能是有趣的。 第一个是runBlock:第二个是group (这允许动作并行)

您可以使用runAction在完成处理程序上运行节点上的操作:完成:

以下代码将每个“animation操作”和“完成”块放在“块操作”中 。 这些阻止行为然后被放入“组动作”中 。 最后,小组的行动被告知要运行。 这会导致每个块的动作同时启动。 每个块操作的完成处理程序调用名为checkCompletion的方法。 此方法检查节点(具有特定的名称属性值),仍然通过调用hasActions节点上的animation。 因为调用checkCompletion方法的节点将返回YES,如果只有一个节点返回YES,则所有animation都会完成。

以下演示了使用两个节点的情况,但是它会工作两个以上。

 // 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... :( }];