在这种情况下,我会避免使用 CCRepeatForever。
创建一个定义当前色调状态(tintGray、tintWhite、tintDone)的枚举,然后创建一个检查状态的预定选择器。
一旦状态完成,重复操作,但对于批处理节点的每个子节点(假设它们是唯一的子节点)。
要安排选择器,请将以下内容放在您的 init 或其他加载方法中:
// 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];
}
显然这并不完美,因为标志将由第一个精灵驱动以完成着色,但延迟应该可以忽略不计。如果你想确保它们都完成,只需将标志更改为精灵数量的运行计数,因此只有在 tintState 等于批处理节点中的精灵数量时才会调用“tinter”。