2013-09-28 8 views
5

Ho il codice seguente:La sequenza SKAction in realtà attende fino al termine dell'azione?

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

    }]; 
} 

voglio le mie azioni di aspettare fino a quando in realtà è fatto l'azione precedente. Significato, le mie azioni devono essere sequenziate in modo che l'azione rep non ripeta l'azione action finché l'oggetto FINISHES non si muove. Attualmente, sembra che l'output esegua immediatamente tutte le azioni e non le esegua in sequenza come dovrebbe. Ho letto la documentazione e quello che ho ora è quello che hanno detto di fare ...

risposta

4

L'azione runBlock: è un tipo di azione "una volta sola". Eseguirà il blocco esattamente una volta, quindi l'azione "termina" immediatamente dopo.

Quello che vuoi è qualcosa che le azioni non sono progettate per gestire. Corrono una volta, o per un dato periodo di tempo (durata). Tuttavia, non corrono finché non viene soddisfatta una condizione arbitraria, che può essere vera immediatamente, può diventare vera alla fine o non può mai diventare vera. Questo tipo di invalidazione di tutte le funzioni di temporizzazione delle variabili è in grado di eseguire azioni (ad esempio, linear vs easy ridimensionamento del tempo).

Quello che puoi fare è emettere il movimento "moveToSpriteNode" come azione e controllare separatamente in un metodo di aggiornamento se lo sprite è arrivato al nodo. In tal caso, eseguiresti la successiva azione di movimento (senza usare una sequenza).

Più facilmente si può semplicemente contare sull'azione di movimento per terminare il significato che lo sprite è arrivato al nodo di destinazione. Quindi ciò innescherebbe la successiva azione di movimento nella sequenza. Se si desidera eseguire un blocco di completamento su ciascun target, è sufficiente pianificare l'azione di spostamento successiva all'interno del blocco di completamento.

Problemi correlati