停止SKAction

时间:2014-05-13 19:48:43

标签: ios objective-c sprite-kit background-music skaction

我有一个不同场景的精灵套件游戏:主菜单(“MainMenuScene”)和游戏场景(“MyScene”)。当用户正在玩游戏时,我有无尽的背景音乐。但是当玩家想要停止游戏并返回主菜单时,背景音乐会继续播放。我该怎么办才能让它停下来?我试过了[self removeAllActions],但它没有用。

MyScene:

    @implementation MyScene
{
    SKAction *_backgroundMusic;
}

-(id)initWithSize:(CGSize)size {
    if (self = [super initWithSize:size]) {

        self.backgroundColor = [SKColor colorWithRed:0.15 green:0.5 blue:0.3 alpha:1.0];
    }
    //Here I make the endless background music 
_backgroundMusic = [SKAction playSoundFileNamed:@"Background 2.m4a" waitForCompletion:YES];
    SKAction * backgroundMusicRepeat = [SKAction repeatActionForever:_backgroundMusic];
    [self runAction:backgroundMusicRepeat];
    return self;
}

- (void)selectNodeForTouch:(CGPoint)touchLocation
{
    SKSpriteNode *touchedNode = (SKSpriteNode *)[self nodeAtPoint:touchLocation];
    if ([_MainMenuButton isEqual:touchedNode]) {
        SKScene *mainMenuScene = [[MainMenuScene alloc]initWithSize:self.size];
        [self.view presentScene:mainMenuScene];
//Here is where the music should stop, when the player presses the 'return to main menu' button
    } 
}

2 个答案:

答案 0 :(得分:1)

我不建议使用SKAction播放背景音乐。而是使用AVAudioPlayer。

使用AVAudioPlayer:

  1. 将AVFoundation添加到您的项目中。

  2. #import <AVFoundation/AVFoundation.h>到您的.m文件中。

  3. 在@implementation

  4. 中添加AVAudioPlayer *_backgroundMusicPlayer;

    使用此代码段运行音频:

    - (void)playBackgroundMusic:(NSString *)filename
    {
        NSError *error;
        NSURL *backgroundMusicURL = [[NSBundle mainBundle] URLForResource:filename withExtension:nil];
        _backgroundMusicPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:backgroundMusicURL error:&error];
        _backgroundMusicPlayer.numberOfLoops = -1;
        _backgroundMusicPlayer.volume = 0.8;
        _backgroundMusicPlayer.delegate = self;
        [_backgroundMusicPlayer prepareToPlay];
        [_backgroundMusicPlayer play];
    }
    

    同时阅读AVAudioPlayer Class Reference,以便了解所有属性的功能,例如设置音量,循环次数等等。

答案 1 :(得分:0)

试试这个播放音乐:

  [self runAction:backgroundMusicRepeat withKey:@"bgmusic"];

然后停止:

  [self removeActionForKey:@"bgmusic"];

更新

SKAction * backgroundMusicRepeat = [SKAction playSoundFileNamed:@"Background 2.m4a" waitForCompletion:YES];
backgroundMusicRepeat = [SKAction repeatActionForever:backgroundMusicRepeat];

 [self runAction:backgroundMusicRepeat];

我已经在我自己的项目中运行这些代码,看起来很有效。 但不是你的方式,它只在我退出视图时停止,我甚至不需要removeActionForKey[self removeActionForKey:@"bgmusic"];无法在场景中使用。

因此,如果您想在同一视图的不同场景之间切换时停止声音,我建议您使用AVAudioPlayer。

我还发现stackoverflow中的其他一些问题与你有同样的问题,如下所示: how to pause the sound when use SpriteKit 还有这个: Spritekit stopping sound 他们都去AVAudioPlayer。

作为这些链接中的评论之一说: 你应该使用playSoundFileNamed方法播放声音效果...短暂的1或2秒,如爆炸声 - 不要用它来做背景声音。