目标:我想呈现一个新场景:
[self.scene.view presentScene:level2 transition:reveal];
并结束当前的背景音乐以启动新的背景音乐(2级的新背景音乐)。
TheProblem:在呈现新场景时,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];
}
在评论代码行中,您可以查看我已尝试过的内容以及不起作用的内容。 :
[self removeAllActions];
[self removeActionForKey:@"play"];
什么都没做。 的:
self.scene.view.paused = YES;
行仅停止转换,但音乐仍然继续。
我尝试过以下方法: - 在:
上使用弱或强属性@property (nonatomic,weak) SKAction *playBackgroundSound;
保护指向SKAction的指针,因此我可以使用“withKey”属性访问它,因为我在“initWithSize”中初始化了SKAction。有人写道,SKAction是一个即发即弃的对象我理解为没有存储指针,以后访问它是不可能的(直接)。但是,它没有起作用/帮助我。
我查看了很多其他的stackoverflow帖子,没有人帮助过我,或者至少让我知道为什么会这样:
SKAction playSoundFileNamed stops background music
Stop SKAction that RepeatsForever - Sprite Kit
Is it possible to end an SKAction mid-action?
... 思考:似乎动作是通过创建SKScene对象创建的。它被“迷住”并在音频持续时间之后完成。当我使用repeatForever时,它永远不会停止。但是没有办法暂停或停止它。 我也尝试将SKAction挂钩到SKSpriteNode。装载SKScene时,动物会装载它。所以我尝试在SKSpriteNode上挂钩SKAction,并使用与SKSpriteNode相同的removeAllActions,但它也不起作用。
我检查了SKAction,SKView,SKScene,SKSpriteNode上的文档,但最后它对我没什么帮助。
看起来该对象存在于某处运行其动作。
错误与此无关:
这不是模拟器或设备相关的错误 - 我在模拟器和设备上测试了它的结果相同(错误)。
这不是项目相关的错误 - 我在一个单独的项目中进行了测试,小得多,结果相同(错误)。
临时解决方案: 我一直在使用AVFoundation框架中的AVAudioPlayer类。我创建了一个:
//@property (nonatomic) AVAudioPlayer *theBackgroundSong;
这并没有多大帮助,因为我想在加载level2时更改theBackgroundSong并且从嵌套的SKScene结构访问属性时遇到了很大的问题。
任何建议,线索,暗示或想法都会有很大的帮助。
答案 0 :(得分:14)
从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];
当您需要播放新音乐时,请将新播放器放入使用新乐曲初始化的媒体中。
希望这有帮助。
答案 1 :(得分:2)
现在,您可以通过为其指定关键字符串来停止播放声音操作,然后再使用let action: SKAction = SKAction.playSoundFileNamed("sounds/boom.wav", waitForCompletion: true)
self.runAction(action, withKey:"die-sound")
// later you do:
self.removeActionForKey("die-sound")
抱歉,这是Swift。但它可以移植到Obj-C。
/auth
我测试成功了