2014-05-13 1 views
2

J'ai un jeu de sprite avec différentes scènes: le menu principal ("MainMenuScene") et la scène de jeu ("MyScene"). Pendant que l'utilisateur joue au jeu, j'ai une musique de fond sans fin. Mais quand le joueur veut arrêter le jeu et revenir au menu principal, la musique de fond continue à jouer. Que dois-je faire pour l'arrêter? J'ai essayé [self removeAllActions] mais cela n'a pas fonctionné.Arrêt d'une SKAction

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 
    } 
} 
+0

Possible Dupliquer: http://stackoverflow.com/questions/19754871/how-to-pause-the-sound-when-use-spritekit – 68cherries

+0

Vous ne devriez vraiment pas utiliser des ivars ici, mais une propriété forte. Pouvez-vous vérifier que l'action n'est pas nulle avant de l'enlever. Je pense que ça pourrait être nul. Juste vérifier si lol! – Fogmeister

+0

Peu importe ce que vous faites, l'audio initié par SKAction ne s'arrêtera pas. –

Répondre

1

Je ne recommande pas d'utiliser SKAction pour lire de la musique de fond. Au lieu de cela, utilisez AVAudioPlayer.

Pour utiliser le AVAudioPlayer:

  1. Ajouter le AVFoundation à votre projet.

  2. #import <AVFoundation/AVFoundation.h> dans votre fichier .m.

  3. Ajouter AVAudioPlayer *_backgroundMusicPlayer; dans @implementation

Utilisez cet extrait de code pour faire fonctionner votre audio:

- (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]; 
} 

lire également sur le AVAudioPlayer Class Reference afin que vous sachiez ce que toutes les propriétés font telles que la mise volume, nombre de boucles, etc ...

0

essayer de jouer la musique:

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

et cela pour arrêter:

[self removeActionForKey:@"bgmusic"]; 

mise à jour

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

[self runAction:backgroundMusicRepeat]; 

J'ai exécuté ce code dans mon propre projet et semble fonctionner. mais pas votre chemin, il ne s'arrête que lorsque je quitte la vue, je n'ai même pas besoin de removeActionForKey. [self removeActionForKey:@"bgmusic"]; ne fonctionnera pas dans la scène. Donc si vous voulez arrêter le son tout en basculant entre les différentes scènes de la même vue, je vous suggère d'utiliser AVAudioPlayer.

Je trouve aussi quelques autres questions stackoverflow a le même problème que vous, comme ceci: how to pause the sound when use SpriteKit et ceci: Spritekit stopping sound les deux vont pour le AVAudioPlayer.

comme l'un des commentaires dans les liens dit: vous devez utiliser la méthode playSoundFileNamed pour jouer des effets sonores ... quelque chose de court 1 ou 2 secondes, comme une explosion sonore --Ne l'utiliser pour le fond du son.

+0

Non, cela n'a pas fonctionné ... –