如何阻止排队等待?

时间:2011-09-15 14:01:16

标签: ios cocos2d-iphone touch

我正在努力实现以下目标

  1. 用户按下CCMenuItem
  2. 播放声音文件(我将其设置为 背景音乐,所以我可以检查它是否正在播放)
  3. 禁用触控所有CCMenuItem的
  4. 等待声音文件完成播放
  5. 完成所有CCMenuItems上的声音文件重新启用触摸后
  6. 我在模型中使用的函数执行以下操作:

    - (void) waitForAudio
    {
        while ([[SimpleAudioEngine sharedEngine] isBackgroundMusicPlaying]) {
            NSLog(@"Waiting for audio to finish");
        }
    }
    

    我的观点有以下功能:

    -(void) setPlaygroundAsTouchable:(BOOL)touchable
    {
        [_menuItem0 setIsEnabled:touchable];
        [_menuItem1 setIsEnabled:touchable];
        [_menuItem2 setIsEnabled:touchable];
    
        _menu.isTouchEnabled=touchable;
    }
    

    控制器在模型启动时调用并设置视图功能,并分别结束声音文件NO和YES。

    我面临的问题是,我的CCMenuItems上的触摸似乎在播放音频时排队 - 这意味着当声音文件完成时,每次触摸都会被注册和处理。在我的waitForAudio函数仍在循环时,有没有办法让我停止排队?

1 个答案:

答案 0 :(得分:0)

waitForAudio函数阻塞了主线程,因此触摸排队了。这不是确定音频文件何时完成播放的正确方法。以下代码段显示了正确的监听音频文件播放方式(Credit:toadkick Source link。)

[[CDAudioManager sharedManager] setBackgroundMusicCompletionListener:self selector:@selector(musicFinished)];
[[SimpleAudioEngine sharedEngine] playBackgroundMusic:@"someMusic.mp3" loop:NO];
[self setPlaygroundAsTouchable:NO];

-

-(void)musicFinished
{
    [[CDAudioManager sharedManager] setBackgroundMusicCompletionListener:nil selector:nil];
    [self setPlaygroundAsTouchable:YES];
}