0

簡単に言えば、ゲームの新しいレベルを開始する前に、カウントダウンを表示します (CCLabelTTF、Cocos2D を使用)。

私はこのコードを持っています:

centerLevelLabel.string=@"New level";
centerLevelLabel.visible=true;
[centerLevelLabel runAction:[CCFadeOut actionWithDuration:1]];


while (centerLevelLabel.numberOfRunningActions>0) {

}

centerLevelLabel.string=@"3";
while (centerLevelLabel.numberOfRunningActions>0) {

}



centerLevelLabel.string=@"2";
while (centerLevelLabel.numberOfRunningActions>0) {

}

centerLevelLabel.string=@"1";
while (centerLevelLabel.numberOfRunningActions>0) {

}

//以下のコード

thist ラベルを表示したいので、次のコードを続行する必要があります。問題は、ブロックが無限ループを実行している間、最初に UI がフリーズすることです。しかし、実行中のアクションが終了すると numberOfRunningActions がゼロになるため、その理由はわかりません。

実行中のアクションの終了を待ってから続行するにはどうすればよいですか?

ありがとうございました

4

2 に答える 2

2

CCSequenceを使用してアクションをシリアル化し、CCCallFuncNを追加して、元のアクションの完了後にコードを実行することができます。

id action1 = [CCFadeOut actionWithDuration:1];
id action2 = [CCCallFuncN actionWithTarget:self selector:@selector(finishedRunning)];
id sequenceActions = [CCSequence actions:action1, action2, nil]];

[centerLevelLabel runAction:sequenceActions];

...。

   -(void) finishedRunning {
      // Do stuff after action finishes
   }
于 2012-08-01T22:29:30.497 に答える
2

これは常に無限ループになります。

while (centerLevelLabel.numberOfRunningActions > 0) 
{
}

それは書くことに似ています:

while (value > 0)
{
}

while ループが実行されている間、スレッドはブロックされます。したがって、アクションの数を更新する、または値の値を変更する可能性のある他のコードは実行されません。

于 2012-08-01T22:21:48.040 に答える