12

目標: 新しいシーンを提示したい:

[self.scene.view presentScene:level2 transition:reveal];

新しいバックグラウンド ミュージック (レベル 2 からの新しいバックグラウンド ミュージック) を開始するために、現在のバックグラウンド ミュージックを終了します。

問題: ゲーム全体がいくつかのミニゲームで構成されているため、新しいシーンを提示すると、シーン (レベル 1) のバックグラウンド ミュージックが再生され続け、ミニゲームを終了しても停止しません。

再生される音楽は 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;

「initWithSize」でSKActionを初期化したので、「withKey」プロパティを使用してアクセスできるように、SKActionへのポインターを保護します。誰かが SKAction はファイア アンド フォーゲット オブジェクトであると書きましたが、それへのポインターを保存しないと後で (直接) アクセスすることはできないと私は理解しました。しかし、それはうまくいきませんでした/私を助けてくれました。

私は他の多くのスタックオーバーフローの投稿を調べましたが、誰も助けてくれなかったり、少なくともこれが起こる理由を教えてくれませんでした:

SKAction playSoundFileNamed はバックグラウンド ミュージックを停止します

永遠に繰り返す SKAction を停止する - スプライト キット

アクションの途中で SKAction を終了することは可能ですか?

スプライト キット シーンの一時停止

・・・感想: SKSceneオブジェクトの作成でアクションが作成されているようです。それに「フック」され、オーディオの長さの後に終了します。repeatForever を使用している間は、停止しませんでした。ただし、一時停止または停止する方法はありません。また、SKAction を SKSpriteNode にフックしてみました。SKScene が読み込まれると、動物が読み込まれます。そのため、SKSpriteNode で SKAction をフックして、SKSpriteNode から removeAllActions などを使用しようとしましたが、うまくいきませんでした。

SKAction、SKView、SKScene、SKSpriteNode のドキュメントを確認しましたが、最終的にはあまり役に立ちませんでした。

アクションを実行しているオブジェクトがどこかに存在するようです。

エラーの内容:

  • これはシミュレーターまたはデバイス関連のエラーではありません。シミュレーターとデバイスの両方でテストしましたが、同じ結果 (エラー) でした。

  • これはプロジェクト関連のエラーではありません - 別のプロジェクトでテストしましたが、はるかに小さく、同じ結果 (エラー) でした。

一時的な解決策: AVFoundation フレームワークの AVAudioPlayer クラスを使用しています。私が作成した:

//@property (nonatomic) AVAudioPlayer *theBackgroundSong;

level2 がロードされたときに theBackgroundSong を変更したかったので、これはあまり役に立ちませんでした。ネストされた SKScene 構造からプロパティにアクセスする際に大きな問題がありました。

アドバイス、手がかり、ヒント、またはアイデアは非常に役立ちます。

4

2 に答える 2