Мне нужно запустить действие по набору узлов в cocos2d-x, а затем запустить обратный вызов, когда все эти действия будут завершены.
Например. У меня есть 20 объектов, я хочу, чтобы они масштабировались до определенного значения, и когда все эти действия завершены, я хочу обновить другой объект (пусть называют его шаром) на экране.
Я попробовал установить действие на шаре, ожидая фиксированную задержку, которая должна учитывать общее время выполнения самого длинного действия из списка ранее. Даже если этот подход работает достаточно хорошо, иногда действие с задержкой выполняется до того, как последний объект из первого списка завершит свой собственный. Более того, время выполнения каждого из этих действий может время от времени меняться, так что фиксированная задержка будет угаданным значением для наихудшего сценария. Не очень хорошо, на мой взгляд.
Есть ли способ в cocos2d-x для достижения этого изначально, используя предоставленные API?
Я бы сделал это примерно так (в objc, надеюсь, что c++ sdk имеет похожие функции):
_animComletes = 0; // must be an iVar
_maxBalls = [_nodes count]; // nust be an iVar
for (CCNode *nn in _nodes) {
id oneObject = [CCSequence actions:
[CCScaleTo actionWithDuration:.25 scale:.35],
[CCCallBlock actionWithBlock:^{
_animCompletes++;
if (_animCompletes == _maxBalls) {
[self scheduleOnce:@selector(updateBall) delay:0];
}
}], nil];
[nn runAction:oneObject];
}
-(void) updateBall {
_animCompletes = 0;
_maxBalls = 0;
// do your thing
}
[nn runAction:]
но[nn customAction]
через пользовательскую функцию. Я задавался вопросом, была ли у cocos2d / x возможность группировать объекты и прослушивать их действия для завершения, без использования пользовательских счетчиков и тому подобного.