2013-09-28 11 views
5

Mam następujący kod:Czy sekwencja SKAction rzeczywiście czeka, aż akcja się zakończy?

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

    }]; 
} 

chcę moje działania rzeczywiście poczekać aż poprzednia akcja jest wykonywana. Oznacza to, że moje działania muszą zostać zsekwencjonowane, tak aby akcja rep nie powtarzała akcji action, dopóki obiekt nie zakończy ruchu. Obecnie wygląda na to, że dane wyjściowe natychmiast uruchamiają wszystkie akcje i nie sekwencjonują ich tak, jak powinny. Przeczytałem dokumentację i mam teraz to, co oni powiedzieli ...

Odpowiedz

4

Działanie runBlock: jest działaniem jednorazowym. Uruchamia blok dokładnie raz, a następnie akcja "kończy się" natychmiast po tym.

To, czego chcesz, to coś, czego działania nie są przeznaczone do obsługi. Działają one raz lub przez określony czas (czas trwania). Nie działają one jednak, dopóki pewien arbitralny warunek nie zostanie spełniony - co może być prawdą natychmiast, może ostatecznie stać się prawdą lub może nigdy nie stać się prawdą. Ten rodzaj unieważnia wszystkie funkcje zmiennych o zmiennych czasowych, które są w stanie (tj. Liniowe w porównaniu do łatwego skalowania czasu).

To, co możesz zrobić, to wydać ruch "moveToSpriteNode" jako działanie i oddzielnie sprawdzić metodę aktualizacji, czy duszek przybył do węzła. Jeśli tak, uruchomisz następną akcję ruchu (nie używając sekwencji).

Łatwiej można po prostu polegać na akcji przesuwania do końca, co oznacza, że ​​sprite przybył do węzła docelowego. Wtedy to uruchomi następną akcję ruchu w sekwencji. Jeśli chcesz uruchomić blok ukończenia dla każdego celu, zaplanuj następną akcję ruchu z poziomu bloku ukończenia.

Powiązane problemy