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

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

【问题讨论】:

  • 嗯... [SKAction repeatForever:] 和 playAction 怎么样?
  • 您应该在上面发布您当前拥有的代码。 repeatForever 应该可以正常工作。你在预加载音频吗?

标签: objective-c avfoundation sprite-kit


【解决方案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 将导致声音播放两次,依此类推...
  • 任何负数都会无限循环,直到停止。

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

【讨论】:

【解决方案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];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-07
      • 1970-01-01
      • 2020-07-06
      • 2013-04-23
      • 2015-11-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多