Cocos2D iPhone - запуск действий по нескольким целям + обратный вызов - PullRequest
1 голос
/ 07 февраля 2012

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

Чтобы прояснить объяснение, представим, что оба массива имеют 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, в случае массива) должны выполняться одновременно.

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

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

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

Ответы [ 3 ]

2 голосов
/ 07 февраля 2012

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

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.

Редактировать:

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

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

1 голос
/ 13 июля 2014

Вам может понадобиться этот код для запуска нескольких 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 );
1 голос
/ 08 февраля 2012

В вышеупомянутом случае вы упомянули, что 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-м случае Предположим, что ваше 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]];
}
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...