我正在开发一个使用SpriteKit的驾驶游戏,并且在引擎声音效果方面有问题。
我想要两种不同的引擎声音。一个用于当油门按钮被按下时,另一个用于当油门按钮没有被按下时。游戏进行时,两种声音中的一种将持续播放。
什么是最好的方法?我的声音文件应该非常短(0.10秒或更短)并被循环,还是应该相当长并且只是打开和关闭?我应该使用SKAction来播放声音或AVAudioPlayer或其他什么吗?我试过使用AVAudioPlayer,但是每次我停下来玩玩家(打开或关闭节气门)时,游戏的帧率就会暂时下降。任何帮助都是非常感谢的!
发布于 2014-05-13 16:20:58
基于LearnCocos2D留下的评论,我查看了ObjectAL。对于那些不熟悉ObjectAL的人来说,它被设计成一个简单直观的OpenAL和AVAudioPlayer接口。你可以在这里下载并找到更多关于它的信息..。
http://kstenerud.github.io/ObjectAL-for-iPhone/index.html
对于我的音频剪辑,我使用了3到5秒长的电机声音的.caf音频文件。ObjectAL允许我连续循环并改变音频文件的音高。通过改变螺距,我可以模拟不同速度的电机。
下面是代码的示例..。
两个成员变量或者可以将它们设置为属性..。
ALBuffer *_buffer;
ALSource *_source;方法初始化电机的声音效果。
- (void)initializeSound
{
// We'll let OALSimpleAudio deal with the device and context.
// Since we're not going to use it for playing effects, don't give it any sources.
[OALSimpleAudio sharedInstance].reservedSources = 0;
_source = [ALSource source];
_buffer = [[OpenALManager sharedInstance] bufferFromFile:@"EngineSound.caf"];
_source.pitch = 0.30; // Start at low pitch for engine idle.
[_source play:_buffer loop:YES];
}在我的SKScene更新方法中,我会根据速度来调整音高。
- (void)update:(CFTimeInterval)currentTime
{
CGFloat enginePitch;
// Code to calculate desired enginePitch value based on vehicle speed.
_source.pitch = enginePitch;
}由于SpriteKit中的一个错误,我在关闭应用程序时遇到了gpus_ReturnNotPermittedKillClient EXC_BAD_ACCESS错误的问题。我在这里找到了修复装置..。
发布于 2014-05-08 07:41:54
我建议使用AVAudioPlayer。您需要在属性中拥有它,而不是每次想要播放某个内容时都创建它。SKAction在某种程度上是不好的,您不能停止或取消它(即使通过删除操作)。
https://stackoverflow.com/questions/23532310
复制相似问题