2013-09-28 9 views
5

Ich habe den folgenden Code:Wartet die SKAction-Sequenz tatsächlich bis zum Ende der Aktion?

-(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; 

    }]; 
} 

Ich möchte, dass meine Aktionen warten, um tatsächlich, bis die letzte Aktion durchgeführt wird. Das heißt, müssen meine Handlungen so sequenziert werden, dass die rep Aktion wiederholen nicht die action Aktion, bis das Objekt bewegt AUSBAU. Momentan scheint es so, als würde die Ausgabe sofort alle Aktionen ausführen und sie nicht so ablaufen lassen, wie es sollte. Ich habe die Dokumentation gelesen und was ich jetzt habe ist, was sie gesagt haben ...

Antwort

4

Die runBlock: Aktion ist ein Feuer-einmal Art von Aktion. Es wird den Block genau einmal ausführen, danach "endet" die Aktion unmittelbar danach.

Was Sie wollen, ist etwas Aktionen sind nicht zu behandeln entworfen. Sie laufen einmal oder für einen bestimmten Zeitraum (Dauer). Sie laufen jedoch nicht, bis irgendeine willkürliche Bedingung erfüllt ist - was möglicherweise sofort wahr ist, vielleicht irgendwann wahr werden oder niemals wahr werden kann. Diese Art von ungültig macht alle Variablen Timing-Funktionen in der Lage sind (dh lineare gegen Leichtigkeit Skalierung der Zeit).

Was Sie tun können, ist die „moveToSpriteNode“ Bewegung als Aktion zur Ausgabe und separat in einer Update-Methode überprüfen, ob das Sprit an dem Knoten angekommen ist. In diesem Fall würden Sie die nächste Bewegungsaktion ausführen (ohne eine Sequenz zu verwenden).

Leichter können Sie einfach auf die Bewegungsaktion verlassen Sinn zu beenden, dass das Sprite am Zielknoten angekommen ist. Dann würde dies die nächste Bewegungsaktion in der Sequenz auslösen. Wenn Sie einen Abschlussblock für jedes Ziel ausführen möchten, planen Sie einfach die nächste Verschiebungsaktion innerhalb des Abschlussblocks.