SpriteKit 中的循环背景音乐

Posted

技术标签:

【中文标题】SpriteKit 中的循环背景音乐【英文标题】:Loop background music in SpriteKit 【发布时间】:2014-03-09 19:48:22 【问题描述】:

我正在完成一款使用 SpriteKit 框架完成的 ios 游戏。我想知道在用户播放时是否有任何方法可以循环播放背景音乐。 SpriteKit 包含一个简单的音乐播放器,但它不允许循环播放音乐......所以我想知道我怎么能做到这一点。谢谢!

【问题讨论】:

差不多这个答案***.com/a/4570522/2054786 嗯... [SKAction repeatForever:] 和 playAction 怎么样? 您应该在上面发布您当前拥有的代码。 repeatForever 应该可以正常工作。你在预加载音频吗? 【参考方案1】:

您可以为此使用AVAudioPlayer

在您的 .h 中:

#import <AVFoundation/AVFoundation.h>

并将以下内容添加到interface

AVAudioPlayer *player;

在.m中,使用音频誓言url初始化播放器:

NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle]
                                             pathForResource:@"bg_music"
                                             ofType:@"mp3"]];
player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
player.numberOfLoops = -1;

当您需要播放音频时,您可以拨打:

[player play];

注意: “numberOfLoops”是声音到达结尾时返回开头的次数。

零值表示只播放一次声音。 值 1 将导致声音播放两次,依此类推... 任何负数都会无限循环,直到停止。

继续编码...... :)

【讨论】:

这是正确的答案。 Apple 的文档甚至说要为背景音乐这样做:developer.apple.com/reference/spritekit/skaction/…【参考方案2】:

我宁愿使用 SKAction:

[SKAction repeatForever:[SKAction playSoundFileNamed:@"hello.caf" waitForCompletion:YES]];

或:

[SKAction repeatAction:[SKAction playSoundFileNamed:@"hello.caf" waitForCompletion:YES]
                 count:100];

更多信息请访问Apple Developer。

【讨论】:

如果我输入 nil,它会说:“指向整数转换的指针不兼容”。如果我输入“是”,音乐似乎不会循环播放,如果我输入“否”,音乐会不断开始……我的音乐文件在 .m4a 中,有问题吗? @Bytes,只需发送 YES 即可在那里等待参数,而不是 nil。关于支持的格式 - 无法告诉您,请参阅 Apple Docs。应该可以正常工作,在 SpriteKit 的 WWDC 演示文稿中看到了一个示例。 我在 XCode 中收到 No know class method for selector 'repeatForever' 错误。 看文档,可能你的意思是repeatActionForever 实际上我的代码[SKAction repeatActionForever:[SKAction playSoundFileNamed:@"outer_space_rumble_lp_01.wav" waitForCompletion:YES]]; 没有播放音频...我尝试过放入不同的文件/方法,但没有运气。有人有什么建议吗?【参考方案3】:

您可以通过两种方式做到这一点。

第一:

1) @import AVFoundation; //将这个导入到AppDelegate文件中

2) @property (nonatomic) AVAudioPlayer * backgroundMusicPlayer; //在AppDelegate文件中定义一个属性

3)在AppDelegate文件中的didFinishLaunchingWithOptions委托方法下写了如下代码

NSError *error;
    NSURL * backgroundMusicURL = [[NSBundle mainBundle] URLForResource:@"bg" withExtension:@"wav"];
    self.backgroundMusicPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:backgroundMusicURL error:&error];
    self.backgroundMusicPlayer.numberOfLoops = -1;
    [self.backgroundMusicPlayer prepareToPlay];

4) 现在您可以在任何类中使用 backgroundMusicPlayer 属性,如下面的代码

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
[appDelegate.backgroundMusicPlayer play];

第二个:

如果你想使用 SKAction 使用下面的代码

SKAction *wait = [SKAction waitForDuration:10.0];
        SKAction *performSelector = [SKAction performSelector:@selector(playEffectBgSounds) onTarget:self];
        SKAction *sequence = [SKAction sequence:@[performSelector, wait]];
        SKAction *repeat   = [SKAction repeatActionForever:sequence];
        [self runAction:repeat];

-(void)playEffectBgSounds

    //Play Sound
    [self runAction:[SKAction playSoundFileNamed:@"chick.mp3" waitForCompletion:NO]];


【讨论】:

这是我发现专用 AudioPlayer Singleton 比使用 AppDelegate 更清洁的解决方案的情况之一。在大多数游戏中,您一次只能听到一首歌曲。【参考方案4】:

在你的场景类中添加:

方法一:

self.run(SKAction.repeatForever(SKAction.playSoundFileNamed("music.mp3", waitForCompletion: true)))

方法二:

self.addChild(SKAudioNode(fileNamed: "music.mp3"))

【讨论】:

【参考方案5】:
AVAudioPlayer *myplayer = ...
[myplayer setNumberOfLoops: INFINITY];

【讨论】:

以上是关于SpriteKit 中的循环背景音乐的主要内容,如果未能解决你的问题,请参考以下文章

SpriteKit:场景中的静态背景与移动的 SKCameraNode

SpriteKit 中的无限滚动背景

从 SpriteKit 中的类播放音频

在 viewDidLoad Swift 3 中循环播放音频音乐的问题

如何在 spriteKit swift 4 中制作无限背景

如果 spritekit 中正在播放来自另一个应用程序的音乐,如何使 AVAudioPlayer 静音