xcode sprite kit 背景音乐

Posted

技术标签:

【中文标题】xcode sprite kit 背景音乐【英文标题】:xcode sprite kit background music 【发布时间】:2014-07-12 15:20:37 【问题描述】:

我有一个使用 sprite kit 制作的游戏,我添加了一个 30 秒的音频文件,作为我使用 av 音频播放器的游戏的背景音乐无限循环。当游戏从某个状态切换时,我想停止并从我的场景文件开始播放音乐。

这是我的视图 controller.m 文件,我在其中添加了停止音乐方法

@implementation ViewController

- (void)viewDidLayoutSubviews 

    [super viewDidLayoutSubviews];

    NSError *error;
    NSURL *backgroundMusicUrl = [[NSBundle mainBundle] URLForResource:@"game" withExtension:@"wav"];
    _backgroundMusicPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:backgroundMusicUrl error:&error];
    _backgroundMusicPlayer.numberOfLoops =  -1;
    [_backgroundMusicPlayer prepareToPlay];
    [_backgroundMusicPlayer play];

    SKView * skView = (SKView *)self.view;

    // Create and configure the scene.
    SKScene * scene = [MyScene sceneWithSize:skView.bounds.size];
    scene.scaleMode = SKSceneScaleModeAspectFill;

    // Present the scene.
    [skView presentScene:scene];


-(void)stopMusic

    [_backgroundMusicPlayer pause];

然后在我的 scene.m 文件中,我尝试调用 stop music 方法,但是背景音乐并没有停止播放。

-(void)switchToTutorial

    [[ViewController alloc] stopMusic];

    _gameState = GameStateTutorial;

    //remove unwatnted nodes
    for (int i = 0; i < _mainMenu.count; i++)
    
        SKSpriteNode *chosenNode = [_mainMenu objectAtIndex:i];
        [chosenNode removeFromParent];
    

    for (int i = 0; i < _mainMenuButtons.count; i++)
    
        SKSpriteNode *chosenNode = [_mainMenuButtons objectAtIndex:i];
        [chosenNode removeFromParent];
    
    [self setupTutorial];

【问题讨论】:

见***.com/questions/5764890/…你需要创建一个额外的属性,这样你就可以从任何地方访问音乐 【参考方案1】:

问题出在这一行:

[[ViewController alloc] stopMusic];

您正在创建一个新的 ViewController 实例,但应该将 stopMusic 消息发送到当前使用的实例。

实现这一点的一种方法是在场景中拥有一个 ViewController 类型的属性并将 viewController 设置为它。

在 MyScene.h 中

@class ViewController; //below the #import
...
@property(weak) ViewController *viewController;

在 MyScene.m 中

#import "ViewController.h"
...
[self.viewController stopMusic]

在 ViewController.m 中

MyScene * scene = [MyScene sceneWithSize:skView.bounds.size];
scene.viewController = self;

这种方法的问题是您必须为每个场景传递 ViewController。也许有一个静态的AVAudioPlayer 和两个静态方法来启动和停止音乐会更容易,然后你可以调用

[ViewController stopMusic];

如果你已经到了那个阶段,你可以考虑创建一个额外的类,即 MusicPlayer 来为你处理所有的音乐。所以你会打电话给

// in ViewControllers viewDidLoad
[MusicPlayer initializePlayer];

//where needed
[MusicPlayer playMusic];
[MusicPlayer stopMusic];

【讨论】:

在 myscene.h 中声明 viewController 属性后,我仍然无法像您说的那样在 view controller.m 中引用它。然后它不允许我在我的 scene.m 中对属性进行停止音乐调用。 抱歉,*scene 当然必须声明为 MyScene,所以编译器知道它是 MyScene。我修改了代码。 你在 ViewController.h 中声明了-(void)stopMusic; 吗?否则场景不知道viewController有这样的方法。 编译器不断让我将 viewController 属性列为 UIviewcontroller 的对象,而不是像您在代码中那样仅列出“ViewController”?这会是个问题吗,因为当我调用 [[ViewController alloc] stopMusic] 时我仍然无法让音乐暂停; 哈哈当然你应该调用 [self.viewController stopMusic] 然后...只需在 myscene 中导入 ViewController.h 以便编译器知道它的存在和方法

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

使用 Sprite Kit 移动背景

从右到左滚动背景 Swift / Sprite Kit

背景图像大小 Sprite Kit 游戏

iOS 如何在 Sprite Kit 游戏中创建音频淡入/淡出效果?

iOS Sprite Kit教程之xcode安装以及苹果帐号绑定

sprite Kit的奇怪行为