2012-02-07 3 views
1

У меня есть массив объектов (objArray) и массив действий (actArray). Оба массива упорядочены, я имею в виду, что объект с индексом 0 objArray должен выполнить действие 0 на actArray.Cocos2D iPhone - запуск действий по нескольким целям + обратный вызов

Чтобы пояснить объяснение, предположим, что оба массива имеют 3 объекта, obj0, obj1 и obj2.

obj0 has to perform action 0 on actArray 
obj1 has to perform action 1 on actArray 
obj2 has to perform action 2 on actArray 

Эти 3 операции (или n, в случае массива) должны выполняться одновременно.

Когда все анимации заканчиваются, мне нужен метод анимации, который вызывается.

Как это сделать?

Я начинаю в Кокосовые. У меня есть googled вокруг и не нашел никакого практического примера вокруг. Я нашел CCSpan, но я не вижу, как это можно использовать с несколькими объектами каждый со своим действием. Благодарю.

+0

Это опечатка, которую вы хотите, чтобы действие 2 вызывалось на obj1? Должно ли это быть действием 1? –

+0

извините, это опечатка. – SpaceDog

ответ

2

Вы можете просто выполнить действия последовательно, и они будут происходить одновременно.

int yourAnimationDuration; //this needs to be set to whatever your animation speed is 
for(int idx = 0; idx < 3; idx++) { 
    [[objArray objectAtIndex:idx] runAction:[actArray objectAtIndex:idx]]; 
    [self performSelector:@selector(someMethodToBeExecutedWhenAnimationFinishes) withObject:nil afterDelay:yourAnimationDuration]; 
} 

Если вы хотите, чтобы метод анимации был выполнен только один раз, просто выньте его из цикла for.

Edit:

id finalAnimation = [CCSequence actionOne:[actArray objectAtIndex:idx] two:someMethod]; 

Это (я считаю) выполнит свой метод, как только первое действие завершено.

+0

Да, я думал о механизме обратного вызова, но я думаю, что это будет лучший вариант. Спасибо – SpaceDog

+0

Я отредактировал свой ответ с другой возможностью. –

+0

Что касается 'performSelector: withObject: afterDelay:' - было бы лучше избежать этого, потому что у cocos2d есть свой собственный планировщик (с возможностью паузы/возобновления). – brigadir

1

В вышеуказанном случае вы упомянули, someMethodToBeExecutedWhenAnimationFinishes будет выполняться три раза. Просто используйте его 1 раз после цикла. 'yourAnimationDuration' будет временем действия с максимальной продолжительностью, так как все остальные действия должны были закончиться до максимальной продолжительности.

«CCSequence» - хороший вариант, но вам нужно выполнить CCSequence только с действием с максимальной продолжительностью, а не со всеми объектами.

Так в 1-ом случае

int yourAnimationDuration; //this needs to be set to duration of action with maximum time 
for(int idx = 0; idx < 3; idx++) { 
    [[objArray objectAtIndex:idx] runAction:[actArray objectAtIndex:idx]]; 
} 
[self performSelector:@selector(someMethodToBeExecutedWhenAnimationFinishes) withObject:nil afterDelay:yourAnimationDuration]; 

Во 2-й случай Предположим, если ваше второе действие происходит максимальное время.

int actionNum = 2; 
for(int idx = 0; idx < 3; idx++) { 
    if(idx == (actionNum-1)) 
{ 
[[objArray objectAtIndex:idx] runAction:[CCSequence actions:[actArray objectAtIndex:idx],[CCCallFuncN actionWithTarget:self selector:@selector(someMethodToBeExecutedWhenAnimationFinishes:)],nil]; 
} 
else{ 
[[objArray objectAtIndex:idx] runAction:[actArray objectAtIndex:idx]]; 
} 
} 

Надеюсь, что это поможет. Я не запускаю этот код. Поэтому проверьте синтаксис, если таковой имеется. :)

+0

спасибо !!!!!!!!! – SpaceDog

1

Возможно, этот код может занять несколько CCAction (каждое действие для другого CCNode/CCSprite/...); Но начиная все в последовательности!

CCMoveBy *moveUpAction = CCMoveBy::create(0.5,ccp(0,400)); 
CCMoveBy *moveRightAction = CCMoveBy::create(1,ccp(300,0)); 
CCMoveBy *moveDownAction = CCMoveBy::create(1,ccp(0,-400)); 

CCTargetedAction *mm = CCTargetedAction::create(someNode_1,moveUpAction); 
CCTargetedAction *rr = CCTargetedAction::create(someNode_2,moveRightAction); 
CCTargetedAction *dd = CCTargetedAction::create(someNode_3,moveDownAction); 

// Here we first run 'moveUpAction' on someNode_1. 
// After finishing that Action we start 'moveRightAction' on someNode_2 
// After finishing the Action, we start ... 
CCSequence *targetedSeq = CCSequence::create(mm,rr,dd,NULL); 
whateverNode->runAction(targetedSeq); 
Смежные вопросы