Cocos Denshion:与音乐同步播放音效

时间:2012-01-09 10:34:38

标签: iphone ios cocos2d-iphone soundeffect simpleaudioengine

我正在制作音乐游戏,当用户按下音符时,它会发出声音。当用户按下时,声音自然需要立即播放,因此他们可以判断它们是否与音乐同步。然而,感觉好像声音是滞后的,特别是当音符按下变得更快时。

我的背景.m4a音乐文件与AVAudioPlayer一起播放。我选择在Cocos Denshion上使用它,因为我可以访问currentTime属性。我可能错了,但我不认为我可以使用CocosDenshion访问它。

我制作的.wav文件非常短(不到一秒钟)。我在init上预加载我的声音效果:

[[SimpleAudioEngine sharedEngine] preloadEffect:@"Assist.wav"];

然后播放音效,在CCTouchesBegan中我打电话:

[[SimpleAudioEngine sharedEngine] playEffect:@"Assist.wav"];

之后,它调用我的代码来确定用户的时间和奖励积分。知道为什么它可能会滞后,或者用音乐及时播放音效的更好方法吗?

编辑:我最近尝试了一些没有结果的事情。首先,我尝试在歌曲中适当的时间自动播放声音。仍然有滞后,所以我不认为触摸事件是缓慢的。我还尝试了3种不同的声音库。

然而,当我在模拟器中跑步时,它似乎并不是迟钝的。有没有人有想法?我一无所知,这是我无法真正解决的一个重要特征......

3 个答案:

答案 0 :(得分:1)

你应该避免使用这段代码: - [[SimpleAudioEngine sharedEngine] preloadEffect:@" Assist.wav"];

在应用程序启动时,您应该通过编写以下代码加载您的框架SimpleAudioEngine: -

// SimpleAudioEngine * palySound;在.h文件中创建对象。  palySound = [SimpleAudioEngine sharedEngine];

每当你想播放声音时,你都可以写:[palySound playEffect:@" Assist.wav"];

答案 1 :(得分:0)

我不确定你在SoundEngine中做了什么,但根据我自己的经验,不发出延迟播放声音的最佳方法是为每个声音文件分配一个AVAudioPlayer (除非你想开始搞乱AudioQueues)。

这是一个例子:

假设您当前的视图控制器中有AVAudioPlayer *assistPlayer;

在你的viewDidLoad用你的声音初始化它:

NSURL *wavURL = [[NSBundle mainBundle] URLForResource:@"Assist" withExtension:@"wav"];
assistPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:wavURL error:nil];

然后,在您要播放文件的IBAction中,只需执行以下操作:

[assistPlayer play];

你不应该有任何滞后。

答案 2 :(得分:0)

你试过Finch吗?它声称播放低延迟的声音,它也只是OpenAL的包装。

除此之外,我对OpenAL真的没有经验,但可以想到两个可能的滞后原因:

  1. 主线程太忙 - 尝试将工作从其卸载到其他线程 线程。

  2. 也许OpenAL定义的缓冲区太大,因此管道将整个声音加载到缓冲区(或其中的一大块),然后才开始播放。