2013-09-28 2 views
5

У меня есть следующий код:Выполняет ли последовательность SKAction до конца действия?

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

    }]; 
} 

Я хочу, чтобы мои действия на самом деле ждать, пока предыдущее действие не будет сделано. Смысл, мои действия должны быть упорядочены так, чтобы действие rep не повторяло действие action до тех пор, пока объект FINISHES не переместится. В настоящее время кажется, что результат сразу же запускает все действия и не упорядочивает их так, как должно. Я прочитал документацию, и теперь у меня есть то, что они сказали ...

ответ

4

Действие runBlock: - это действие типа «огонь-один». Он будет запускать блок ровно один раз, затем действие «заканчивается» сразу после этого.

Что вы хотите, это то, что действия не предназначены для обработки. Они запускаются один раз или в течение определенного периода времени (продолжительности). Однако они не работают до тех пор, пока не будет выполнено какое-либо произвольное условие, которое может быть истинным немедленно, может стать истинным в конечном итоге или никогда не может стать истинным. Этот тип аннулирует все действия, связанные с функциями переменной времени, которые могут (например, линейные и облегчающие масштабирование времени).

Что вы можете сделать, это выпустить движение moveToSpriteNode в качестве действия и отдельно проверить способ обновления, был ли спрайт прибыл в узел. Если это так, вы должны выполнить следующее действие движения (не используя последовательность).

Сложнее всего вы можете просто полагаться на действие перемещения до конца, означающее, что спрайт достиг целевого узла. Затем это вызовет следующее действие перемещения в последовательности. Если вы хотите запустить блок завершения для каждой цели, просто запланируйте следующее действие перемещения из блока завершения.

Смежные вопросы