我有一个使用精灵套件制作的游戏,我添加了一个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文件中,我试图调用停止音乐方法,但背景音乐不会停止播放。
-(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];
}
答案 0 :(得分:3)
问题在于这一行:
[[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];