目标:我想呈现一个新的场景:
[self.scene.view presentScene:level2 transition:reveal];
为了开始新的背景音乐(来自第二关),需要结束当前的背景音乐。
问题:呈现新场景时,第一关的背景音乐仍在播放,并且即使离开小游戏,也不会停止播放,因为整个游戏由几个小游戏组成。
所播放的音乐是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;
为了在"initWithSize"中初始化SKAction后能够安全地获得指向它的指针,以便我可以访问它,而不仅仅是使用"withKey"属性。有人写道SKAction是一种"fire-and-forget"对象,这意味着如果没有存储指针,就无法直接访问它。然而,这对我没有起到帮助。
我查看了许多其他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时,动物也随之加载。因此,我尝试将SKAction挂钩到SKSpriteNode上,并从SKSpriteNode中使用removeAllActions等方法,但它也没有起作用。
我查看了SKAction、SKView、SKScene和SKSpriteNode的文档,但最终并没有帮助我多少。
看起来这个对象存在于某个地方运行着它的动作。
错误的原因不在于:
不是模拟器或设备相关的错误 - 我已经在模拟器和设备上进行了测试,结果相同(错误)。
不是项目相关的错误 - 我在一个更小的单独项目中进行了测试,结果也是相同的(错误)。
临时解决方案: 我一直在使用AVFoundation框架中的AVAudioPlayer类。我创建了一个:
//@property (nonatomic) AVAudioPlayer *theBackgroundSong;
由于我想在加载level2时更改背景音乐,但是在嵌套的SKScene结构中很难访问该属性,因此这并没有帮助太多。
任何建议、线索、提示或想法都将非常有帮助。