В этом случае я бы не стал использовать CCRepeatForever.
Создайте перечисление, определяющее текущее состояние оттенка (tintGray, tintWhite, tintDone), затем создайте селектор по расписанию, который проверяет состояние.
Как только состояние будет завершено, повторите действия, но для каждого ребенка batchnode (при условии, что это единственные дети).
Чтобы запланировать селектор, поместите его в вашем инициализации или другой метод загрузки:
// be sure to schedule the interval at a fast enough rate
[self schedule:@selector(tick:) interval:0.1f];
Затем определим метод следующим образом:
-(void)tick:(ccTime)dt
{
if(tintState == tintDone)
{
[self unschedule:@selector(tick:)];
[self tinter];
}
}
Затем планировать действия оттенка для всех спрайтов :
-(void)tinter
{
// could init and reuse this somewhere else to save on allocs
CCSequence *actions = [CCSequence actions:
[CCCallBlockN actionWithBlock:^(CCNode* node)
{
tintState = tintGray;
}],
[CCTintTo actionWithDuration: .5 red:128 green: 128 blue: 128],
[CCCallBlockN actionWithBlock:^(CCNode* node)
{
tintState = tintWhite;
}],
[CCTintTo actionWithDuration: .5 red:255 green: 255 blue: 255],
[CCCallBlockN actionWithBlock:^(CCNode* node)
{
tintState = tintDone;
}],
nil];
CCSpriteBatchNode *batch = (CCSpriteBatchNode*) [scene getChildByTag: foo1];
for (CCSprite *flasher in batch.children)
{
[flasher stopAllActions];
[flasher runAction:actions];
}
// reschedule tick checking
[self schedule:@selector(tick:) interval:0.1f];
}
Очевидно, что это не идеально, поскольку флаг будет управляться первый спрайт для завершения тонирования, но задержка должна быть незначительной. Если вы хотите убедиться, что все они закончили, просто измените флаг на число запусков числа спрайтов, так что «tinter» только вызывается, как только tintState равен количеству спрайтов в batchnode.
Спасибо за предложение. Для моего случая я должен иметь возможность добавлять мигалки в произвольные моменты времени (игрок создает их). Я посмотрю на более низкоуровневые способы анимации ... – borkbork
Тогда я бы держался подальше от действия CCTintTo и реализовал это аналогично при обновлении, таком как запланированный метод, с массивом объектов flasher и обновил цвет каждого объекта в массиве в каждом цикле. , Все еще сложный код. g'luck. – YvesLeBorg