2014-05-05 53 views
2

我對SpriteKit很新。我有一組節點需要一起移動到每個節點的不同點,然後在完成所有動畫的動畫後,我想要做其他事情。如何一起動畫多個SKSpriteNode?

我之前用UIView組件做過這個。一個[UIView animateWithDuration:completion:]區塊提供我需要的東西。但是在SpriteKit中,每個節點都有自己的動作並自行動畫。我找不到任何精靈節點的塊動畫。所以我無法控制動畫完成。

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

+0

您可以分配和運行每個節點SKAction移動到不同的順序點..它不會是在準確的同一時間,但有但是需要多長時間來執行的一行代碼之間的差異? – 4GetFullOf

+0

是的,我現在正在這樣做。但是我想在所有節點的動畫完成之後做一些事情。但我找不到辦法做到這一點。 –

回答

3

有幾個SKAction類的方法可能是感興趣的。第一個是runBlock:,第二個是組:(這允許操作並行運行)

您可以運行使用runAction與完成處理程序上的節點動作:完成:

下面的代碼使每個「動畫動作」,在一個「塊行動」結束塊一起。然後將阻止動作放入'組動作'。最後,小組的行動被告知要運行。這會導致每個塊操作同時啓動。每個塊操作的完成處理程序調用名爲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... :(
}]; 
+0

我已經在自己的代碼中實現了你的解決方案,不幸的是在某些情況下'SKAction'永遠不會完成,並且不會執行完成塊。這個解決方案中是否有任何副作用? – Domsware

+0

這一切將如何迅速發展3?如果你想要一堆節點同時或按順序執行一個動作,例如? –