Como parar um SKAction de áudio?
Objetivo: quero apresentar uma nova cena:
[self.scene.view presentScene:level2 transition:reveal];
e encerre a música de fundo atual para iniciar a nova música de fundo (a nova música de fundo do nível 2).
TheProblem: Ao apresentar a nova cena, a música de fundo da 1. cena (nível1) continua sendo reproduzida e NÃO para mesmo ao sair do miniGame, pois todo o jogo consiste em alguns minijogos.
A música tocada é um SKAction:
@implementation WBMAnimalMiniGameLvL1
-(id)initWithSize:(CGSize)size {
if (self = [super initWithSize:size])
{
/* Setup your scene here */
self.temporaryScore = 0;
self.animalSKSprites = [[WBMAnimalsMiniGameModel alloc] init];
self.backgroundImage = [SKSpriteNode spriteNodeWithImageNamed:@"farmBackground1024x768.png"];
self.backgroundImage.position = CGPointMake(CGRectGetMidX(self.frame),
CGRectGetMidY(self.frame));
self.temporaryStartingPointIndex = -1;
[self addChild:self.backgroundImage];
self.playBackgroundSound = [SKAction playSoundFileNamed:@"farm.mp3" waitForCompletion:NO];
//SKAction *repeat = [SKAction repeatActionForever:playSound];
[self runAction:self.playBackgroundSound withKey:@"play"];
[self drawAllAnimalsOntoScreen];
}
return self;
}
Aqui acontece a transição para o próximo nível:
-(void)transitionToNextLevel
{
NSLog(@"transitionToNextLevel");
SKTransition *reveal = [SKTransition moveInWithDirection:SKTransitionDirectionDown duration:0.5];
//SKView *skView = (SKView *)self.view;
SKScene *level2 = [[WBMAnimalMiniGameLvL2 alloc] initWithSize:self.size];
level2.scaleMode = SKSceneScaleModeAspectFill;
[self removeAllActions];
[self removeActionForKey:@"play"];
//self.scene.view.paused = YES;
//self.playBackgroundSound = nil;
[self.scene.view presentScene:level2 transition:reveal];
}
Nas linhas de código dos comentários, você pode ver o que eu já tentei e o que não funcionou. O :
[self removeAllActions];
[self removeActionForKey:@"play"];
não fez absolutamente nada. O:
self.scene.view.paused = YES;
A linha interrompe apenas a transição, mas a música continua.
Eu tentei o seguinte: - usei uma propriedade fraca ou forte em um:
@property (nonatomic,weak) SKAction *playBackgroundSound;
para proteger um ponteiro para o SKAction para que eu possa acessá-lo usando a propriedade "withKey" desde que eu inicializei o SKAction em "initWithSize". Alguém escreveu que o SKAction é um objeto de ignorar que eu entendi como sem ter armazenado um ponteiro para acessá-lo mais tarde, não é possível (diretamente). No entanto, não funcionou / me ajudou.
Eu olhei para muitas outras postagens de stackoverflow e nenhuma me ajudou ou pelo menos me deu uma pista do por que isso acontece:
SKAction playSoundFileNamed interrompe a música de fundo
Pare o SKAction que se repete para sempre - Kit Sprite
É possível encerrar uma ação intermediária do SKAction?
Pausando uma cena do kit de sprite
... Pensamentos: Parece que a ação é criada com a criação do objeto SKScene. É "viciado" e finalizado após a duração do áudio. Enquanto eu estava usando o repeatForever, isso nunca parava. No entanto, não há como pausar ou parar. Eu também tentei conectar o SKAction ao SKSpriteNode. Quando o SKScene é carregado, os animais são carregados com ele. Então, tentei conectar o SKAction no SKSpriteNode e usar removeAllActions e similares no SKSpriteNode, mas ele também não funcionou.
Verifiquei a documentação do SKAction, SKView, SKScene, SKSpriteNode, mas no final não me ajudou muito.
Parece que o objeto existe em algum lugar executando suas ações.
Sobre o que é o erro:
Não é um erro relacionado ao simulador ou ao dispositivo - eu testei no simulador e no dispositivo com o mesmo resultado (erro).
Não é um erro relacionado ao projeto - eu testei em um projeto separado, muito menor e com o mesmo resultado (erro).
Uma solução temporária: eu tenho usado a classe AVAudioPlayer da estrutura AVFoundation. Eu criei um:
//@property (nonatomic) AVAudioPlayer *theBackgroundSong;
Isso não ajudou muito, já que eu queria alterar a música de fundo quando o nível2 foi carregado e tive enormes problemas ao acessar a propriedade a partir de uma estrutura SKScene aninhada.
Qualquer conselho, pista, sugestão ou idéia seria de grande ajuda.