0

我将屏幕的三个区域定义为“热点”,因此如果检测到任何触摸,它会播放特定于区域的声音。一切都很好,除了如果我单击区域 1 然后单击区域 2,区域 2 的声音会切断区域 1。我希望播放任何区域的声音直到完成。因此,如果我单击区域 1,然后单击区域 2,区域 1 的声音将继续播放,区域 2 将在区域 1 上播放。

这是我目前拥有的代码(工作正常,但不允许音频重叠):

   if(point.y < 316 && point.y > 76 && point.x < 220 && point.x > 200)
    {
        NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/sound1.mp3", [[NSBundle mainBundle] resourcePath]]];

        NSError *error;
        audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
        audioPlayer.numberOfLoops = 0;

        if (audioPlayer == nil)
            NSLog([error description]);
        else
            [audioPlayer play];
    }
    if(point.y < 316 && point.y > 76 && point.x < 260 && point.x > 240)
    {
        NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/sound2.mp3", [[NSBundle mainBundle] resourcePath]]];

        NSError *error;
        audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
        audioPlayer.numberOfLoops = 0;

        if (audioPlayer == nil)
            NSLog([error description]);
        else
            [audioPlayer play];
    }
    if(point.y < 316 && point.y > 76 && point.x < 300 && point.x > 280)
    {
        NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/sound3.mp3", [[NSBundle mainBundle] resourcePath]]];

        NSError *error;
        audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
        audioPlayer.numberOfLoops = 0;

        if (audioPlayer == nil)
            NSLog([error description]);
        else
            [audioPlayer play];
    }

有人可以帮我弄清楚如何使这些声音重叠吗?谢谢!

4

1 回答 1

3

看起来您只是为每种情况重新分配 audioPlayer 。如果 audioPlayer 已经在播放一种声音,然后您重新分配它来播放另一种声音,则原始的 audioPlayer 将被销毁并停止播放。

我过去解决此问题的方法是设置多个 AVPlayer 对象,例如:

AVPlayer *_player[MAX_CHANNELS];
NSUInteger _currentChannel;

然后玩:

_player[_currentChannel] = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
_currentChannel++;
if (_currentChannel == MAX_CHANNELS) {
    _currentChannel = 0;
}

然后你不会得到无限数量的重叠音效,但你可以将一些“合理”的数字预定义为 MAX_CHANNELS 并在下一个声音停止第一个声音之前拥有那么多重叠效果。

于 2013-05-22T00:44:46.423 回答