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) {

}

//下面的一些代码

我想显示这个标签,然后我需要继续下面的代码。问题是,UI 被冻结并且在第一个 while 块运行无限循环。但我不知道为什么,因为当运行动作完成时,numberOfRunningActions 为零。

还有其他方法吗,我怎么能等待运行动作结束然后继续?

谢谢

4

2 回答 2

2

这将永远是一个无限循环:

while (centerLevelLabel.numberOfRunningActions > 0) 
{
}

它类似于写作:

while (value > 0)
{
}

在 while 循环运行期间,线程被阻塞。因此,不会运行其他代码来更新操作的数量,或者可能会更改 value 的值。

于 2012-08-01T22:21:48.040 回答
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 回答