5

我正在开发一个使用SpriteKit引擎音效的驾驶游戏,但遇到了问题。

我想要两种不同的引擎声音。一种用于按下油门按钮时,一种用于未按下油门按钮时。在游戏进行时,两种声音中的一种会不断播放。

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

4

2 回答 2

6

根据 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我在这里找到了修复...

https://stackoverflow.com/a/19283721/3148272

于 2014-05-13T16:20:58.987 回答
2

我建议使用 AVAudioPlayer。您需要将其保存在属性中,而不是每次您想玩某些东西时都创建它。SKAction 在某种程度上是不好的,您无法停止或取消它(即使通过删除操作)。

于 2014-05-08T07:41:54.093 回答