この場合、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];
}
明らかに、フラグは最初のスプライトによって駆動されて色付けが完了するため、これは完全ではありませんが、遅延は無視できるはずです。それらがすべて終了したことを確認したい場合は、フラグをスプライト数の実行中のカウントに変更するだけで、「tinter」は、tintState がバッチノード内のスプライト数と等しくなった場合にのみ呼び出されます。