我對SpriteKit
很新。我有一組節點需要一起移動到每個節點的不同點,然後在完成所有動畫的動畫後,我想要做其他事情。如何一起動畫多個SKSpriteNode?
我之前用UIView
組件做過這個。一個[UIView animateWithDuration:completion:]
區塊提供我需要的東西。但是在SpriteKit
中,每個節點都有自己的動作並自行動畫。我找不到任何精靈節點的塊動畫。所以我無法控制動畫完成。
希望,我很清楚。提前致謝。
我對SpriteKit
很新。我有一組節點需要一起移動到每個節點的不同點,然後在完成所有動畫的動畫後,我想要做其他事情。如何一起動畫多個SKSpriteNode?
我之前用UIView
組件做過這個。一個[UIView animateWithDuration:completion:]
區塊提供我需要的東西。但是在SpriteKit
中,每個節點都有自己的動作並自行動畫。我找不到任何精靈節點的塊動畫。所以我無法控制動畫完成。
希望,我很清楚。提前致謝。
有幾個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... :(
}];
我已經在自己的代碼中實現了你的解決方案,不幸的是在某些情況下'SKAction'永遠不會完成,並且不會執行完成塊。這個解決方案中是否有任何副作用? – Domsware
這一切將如何迅速發展3?如果你想要一堆節點同時或按順序執行一個動作,例如? –
您可以分配和運行每個節點SKAction移動到不同的順序點..它不會是在準確的同一時間,但有但是需要多長時間來執行的一行代碼之間的差異? – 4GetFullOf
是的,我現在正在這樣做。但是我想在所有節點的動畫完成之後做一些事情。但我找不到辦法做到這一點。 –