从 SKAction 播放音乐

Posted

技术标签:

【中文标题】从 SKAction 播放音乐【英文标题】:Playing music from a SKAction 【发布时间】:2015-03-16 22:32:05 【问题描述】:

我正在尝试将背景音乐添加到我的游戏中。我有一个开关可以让音乐静音,当你再次点击它时它会播放音乐。 这是播放音乐的代码

 var backgroundMusic = SKAction.playSoundFileNamed("Background.wav", waitForCompletion: true)
 runAction(SKAction.repeatActionForever(backgroundMusic), withKey: "music")

我知道 waitForCompletion 应该设置为 false 以在您点击开关时停止音乐。但是当我将它设置为 false 时,音乐不会播放,它就像静态声音一样。

self.removeActionForKey("music")

那是我用来停止音乐的代码。我想知道您是否可以将音乐静音直到曲目结束,或者在 SpriteKit 中是否有另一种方法可以永久播放音乐。

【问题讨论】:

您可能误解了 waitForComplete 的作用。如果它是真的,那么在声音文件的末尾,它会通知序列,或者foreverAction,它已经完成,以便它可以再次播放。如果它是假的,那么它会立即告诉永远的 Action 做下一件事情。 【参考方案1】:

我建议使用ObjectAL 而不是 Spritekit 作为背景音乐。或者这里有一个我用来做背景音乐的简单方法,借用SKUtils:

-(AVAudioPlayer*)setupSound:(NSString*)file volume:(float)volume
    NSError *error;
    NSURL *url = [[NSBundle mainBundle] URLForResource:file withExtension:nil];
    AVAudioPlayer *s = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
    s.numberOfLoops = -1;
    s.volume = volume;
    [s prepareToPlay];
    return s;

那你这样称呼它:

...
AVAudioPlayer *bgplayer = [self setupSound:@"Background.wav" volume:1.0];
...
[bgplayer play];
...
[bgplayer pause];

【讨论】:

你知道如何在 swift 中做到这一点吗?【参考方案2】:

waitForCompletion : 如果true,则这个action 的持续时间与音频播放的长度相同。如果false,则认为action 已立即完成。

waitForCompletion 设置为false,将创建一个持续时间为0 的操作。因此,永远重复操作将无法正常运行。 您必须等待其播放的持续时间,然后再从头开始播放,以便音乐循环播放。所以将waitForCompletion设置为true

 var backgroundMusic = SKAction.playSoundFileNamed("Background.wav", waitForCompletion: true)

https://developer.apple.com/library/prerelease/ios/documentation/SpriteKit/Reference/SKAction_Ref/index.html#//apple_ref/occ/clm/SKAction/playSoundFileNamed:waitForCompletion:

您可以使用removeActionForKey 停止音乐。

【讨论】:

在播放过程中是否有办法阻止它 您可以使用removeActionForKey停止音乐。

以上是关于从 SKAction 播放音乐的主要内容,如果未能解决你的问题,请参考以下文章

如何停止音频 SKAction?

Spritekit 在游戏时保留 iPhone 音乐

如何检查音乐是不是正在从哪个音乐应用程序播放?

从文件管理器播放音乐文件到我的音乐播放器

AVPlayer 未从音乐库播放

从资源 C# 播放音乐