12

目标:我要呈现一个新场景:

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

在注释代码行中,您可以查看我已经尝试过的内容以及无效的内容。这 :

[self removeAllActions];
    [self removeActionForKey:@"play"];

什么都没做。这:

self.scene.view.paused = YES;

线路仅停止过渡,但音乐仍在继续。

我尝试了以下方法: - 在 a 上使用了弱或强属性:

@property (nonatomic,weak) SKAction *playBackgroundSound;

保护指向 SKAction 的指针,以便我可以使用“withKey”属性访问它,因为我在“initWithSize”中初始化了 SKAction。有人写道,SKAction 是一个即发即弃的对象,我理解为没有存储指向它的指针,以后访问它是不可能的(直接)。但是,它没有工作/帮助我。

我查看了许多其他 stackoverflow 帖子,但没有一个对我有帮助,或者至少给了我一个线索,为什么会发生这种情况:

SKAction playSoundFileNamed 停止背景音乐

停止重复永远的 SKAction - Sprite Kit

是否可以在 SKAction 中途结束?

暂停精灵套件场景

...想法:似乎该动作是通过创建 SKScene 对象来创建的。它与它“挂钩”并在音频持续时间后完成。当我使用 repeatForever 时,它永远不会停止。但是,没有办法暂停或停止它。我还尝试将 SKAction 连接到 SKSpriteNode。当 SKScene 被加载时,动物也会被加载。所以我尝试在 SKSpriteNode 上挂接 SKAction 并使用 SKSpriteNode 中的 removeAllActions 等,但它也不起作用。

我检查了有关 SKAction、SKView、SKScene、SKSpriteNode 的文档,但最后它对我没有多大帮助。

看起来该对象存在于某个运行其操作的地方。

错误不是关于什么:

  • 它不是模拟器或设备相关的错误 - 我已经在模拟器和设备上测试了它,结果相同(错误)。

  • 这不是与项目相关的错误 - 我已经在一个单独的项目中对其进行了测试,它要小得多并且具有相同的结果(错误)。

临时解决方案:我一直在使用 AVFoundation 框架中的 AVAudioPlayer 类。我创建了一个:

//@property (nonatomic) AVAudioPlayer *theBackgroundSong;

这并没有太大帮助,因为我想在加载 level2 时更改背景歌曲,并且我在从嵌套的 SKScene 结构访问属性时遇到了巨大的问题。

任何建议、线索、提示或想法都会有很大帮助。

4

2 回答 2

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

当您需要播放新音乐时,请将新播放器放入使用您的新音乐片段初始化的属性中。

希望这可以帮助。

于 2014-03-23T11:48:06.977 回答
3

现在您可以通过为其分配键字符串然后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")

我测试成功了

于 2015-10-15T18:56:21.717 回答