Как остановить аудио SKAction?
Цель: я хочу представить новую сцену:
[self.scene.view presentScene:level2 transition:reveal];
и завершите текущую фоновую музыку, чтобы запустить новую фоновую музыку (новую фоновую музыку с уровня 2).
Проблема: После представления новой сцены фоновая музыка сцены 1. (level1) продолжает играть и не останавливается даже при выходе из мини-игры, поскольку вся игра состоит из нескольких мини-игр.
Воспроизводимая музыка - это 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;
}
Здесь происходит переход на следующий уровень:
-(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];
}
В строках кода комментариев вы можете увидеть, что я уже пробовал, а что не получилось. The:
[self removeAllActions];
[self removeActionForKey:@"play"];
абсолютно ничего не сделал.:
self.scene.view.paused = YES;
линия останавливает только переход, но музыка все еще продолжается.
Я пробовал следующее: - использовал слабое или сильное свойство на:
@property (nonatomic,weak) SKAction *playBackgroundSound;
чтобы защитить указатель на SKAction, чтобы я мог получить к нему доступ, используя свойство "withKey", так как я инициализировал SKAction в "initWithSize". Кто-то писал, что SKAction - это объект "забей и забудь", и я понял, что без сохранения указателя на него последующий доступ к нему невозможен (напрямую). Однако, это не сработало / не помогло мне.
Я просмотрел много других сообщений от stackru, и ни один из них не помог мне или, по крайней мере, не дал понять, почему это происходит:
SKAction playSoundFileNamed останавливает фоновую музыку
Остановите SKAction, который повторяет Forever - Sprite Kit
Можно ли прекратить SKAction в середине действия?
... Мысли: кажется, что действие создается с созданием объекта SKScene. Это "подключено" к нему и закончено после продолжительности аудио. Пока я использовал repeatForever, он никогда не остановится. Однако нет возможности приостановить или остановить его. Я также попытался подключить SKAction к SKSpriteNode. Когда SKScene загружен, животные загружаются им. Поэтому я попытался подключить SKAction к узлу SKSpriteNode и использовать removeAllActions и тому подобное из SKSpriteNode, но это не сработало.
Я проверил документацию по SKAction,SKView,SKScene,SKSpriteNode, но в итоге это мне не сильно помогло.
Похоже, объект существует где-то, где выполняются его действия.
Что ошибка не о:
Это не ошибка симулятора или устройства - я протестировал и симулятор, и устройство с одинаковым результатом (ошибка).
Это не ошибка, связанная с проектом - я проверил ее в отдельном проекте, гораздо меньшего размера и с тем же результатом (ошибка).
Временное решение: я использую класс AVAudioPlayer из фреймворка AVFoundation. Я создал:
//@property (nonatomic) AVAudioPlayer *theBackgroundSong;
Это не сильно помогло, так как я хотел изменить BackgroundSong при загрузке level2, и у меня были огромные проблемы с доступом к свойству из вложенной структуры SKScene.
Любой совет, подсказка, подсказка или идея будут очень полезны.
2 ответа
Вы не можете остановить воспроизведение звука при запуске из SKAction. Вам понадобится другой движок для запуска фоновой музыки.
Попробуйте AVAudioPlayer - он действительно прост и понятен в использовании. Примерно так будет работать:
Сначала импортируйте заголовок и добавьте новое свойство к вашей сцене или контроллеру представления:
#import <AVFoundation/AVFoundation.h>
@interface AudioPlayerViewController : UIViewController {
@property (strong, nonatomic) AVAudioPlayer *audioPlayer;
}
После этого в viewDidLoad или в методе didMoveToView сцены добавьте следующий код:
- (void)viewDidLoad {
[super viewDidLoad];
NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/audiofile.mp3", [[NSBundle mainBundle] resourcePath]]];
NSError *error;
self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&error];
self.audioPlayer.numberOfLoops = -1;
if (!self.audioPlayer)
NSLog([error localizedDescription]);
else
[self.audioPlayer play];
}
Каждый раз, когда вам нужна музыка, чтобы остановиться, просто позвоните [self.audioPlayer stop];
Если вам нужна новая музыка для воспроизведения, поместите новый проигрыватель в свойство, инициализированное вашей новой музыкальной пьесой.
Надеюсь это поможет.
Теперь вы можете остановить воспроизведение звука, назначив для него строку клавиш, а затем используя removeActionForKey
потом
Извините, это Свифт. Но его можно перенести на Obj-C.
let action: SKAction = SKAction.playSoundFileNamed("sounds/boom.wav", waitForCompletion: true)
self.runAction(action, withKey:"die-sound")
// later you do:
self.removeActionForKey("die-sound")
Я проверил успешно