为iOS SpriteKit游戏播放马达音效... AVAudioPlayer vs SKAction vs?

nin*_*een 5 audio avaudioplayer ios sprite-kit skaction

我正在开发一款驾驶游戏,SpriteKit并且在发动机声音效果方面遇到了麻烦.

我想要两种不同的发动机声音.一个用于按下油门按钮,另一个用于未按下油门按钮的按钮.在游戏开始时,两种声音中的一种将持续播放.

什么是最好的方法?我的声音文件是否应该非常短(0.10秒或更短)并且循环还是应该相当长并且只是打开和关闭?我应该SKAction用来播放声音AVAudioPlayer还是别的什么?我尝试过使用AVAudioPlayer但每次暂停和播放播放器(打开或关闭油门)时,游戏的帧速率会暂时下降.任何帮助表示赞赏!

nin*_*een 6

根据LearnCocos2D留下的评论,我研究了ObjectAL.对于那些不熟悉的ObjectAL,它的设计是一个简单而直观的界面OpenALAVAudioPlayer.您可以在此处下载并查找有关它的更多信息...

http://kstenerud.github.io/ObjectAL-for-iPhone/index.html

对于我的音频剪辑,我使用了3到5秒长的.caf音频文件的电机声音. ObjectAL允许我不断循环并改变音频文件的音高.通过改变音高,我可以以不同的速度模拟电机.

以下是代码示例...

两个成员变量或您可以将它们设置为属性...

ALBuffer *_buffer;
ALSource *_source;
Run Code Online (Sandbox Code Playgroud)

初始化电机音效的方法......

- (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];
}
Run Code Online (Sandbox Code Playgroud)

在我SKScene的更新方法中,我根据速度调整音高.

- (void)update:(CFTimeInterval)currentTime
{
    CGFloat enginePitch;

    // Code to calculate desired enginePitch value based on vehicle speed.

    _source.pitch = enginePitch;
}
Run Code Online (Sandbox Code Playgroud)

由于涉嫌错误SpriteKit,我gpus_ReturnNotPermittedKillClient EXC_BAD_ACCESS在关闭应用时遇到了错误问题.我在这里发现了修复...

/sf/answers/1349860501/