14

私はコード内のあらゆる場所を検索しようとしました:バックグラウンドに移行したときの動作を説明したドキュメント、または一時停止した場合でも役に立たない-バックグラウンドに移行するときに推奨される方法を誰かが教えてくれますか?スプライトキット対応ゲーム?

または、バックグラウンドで描画が行われないことを確認して、iOSによる終了を回避できるようscene.paused = YESにするにはどうすればよいですか?

ありがとう!

4

6 に答える 6

14

ここで言ったようにLearnCocos2D

問題は、アプリがバックグラウンドに入る間、AVAudioSession をアクティブにできないことです。

修正は非常に簡単で、ObjectAL にも適用されます => アプリがバックグラウンドにある間は AVAudioSession を非アクティブに設定し、アプリがフォアグラウンドに入るとオーディオ セッションを再アクティブ化します。

この修正で簡素化された AppDelegate は次のようになります。

#import <AVFoundation/AVFoundation.h>

...

- (void)applicationWillResignActive:(UIApplication *)application
{
    // prevent audio crash
    [[AVAudioSession sharedInstance] setActive:NO error:nil];
}

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    // prevent audio crash
    [[AVAudioSession sharedInstance] setActive:NO error:nil];
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    // resume audio
    [[AVAudioSession sharedInstance] setActive:YES error:nil];
}

PS: この修正は Kobold Kit v7.0.3 に含まれる予定です。

于 2013-10-12T12:09:04.127 に答える
10

この一見単純な解決策がなぜアプリの起動時にクラッシュを引き起こすのか不思議に思っていましたが、iAd を実行していたことが原因でした。だから、心に留めておくべきこと:@MassivePenguinの答えは機能しますが、iAdをSKView使用している場合は、経由で取得する必要があります。そうしないとsubviews、(明らかに)クラッシュします。

-(SKView*)getSKViewSubview{
    for (UIView* s in self.window.rootViewController.view.subviews) {
        if ([s isKindOfClass:[SKView class]]) {
            return (SKView*)s;
        }
    }
    return nil;
}

- (void)applicationWillResignActive:(UIApplication *)application {    
    SKView* view = [self getSKViewSubview];

    if (view) {
        view.paused = YES;
    }

}

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    SKView* view = [self getSKViewSubview];

    if (view) {
        view.paused = NO;
    }

}
于 2014-02-22T08:39:44.917 に答える
1

私にとっては、提供されたソリューションのどれも機能しませんでした。私はそれを行う別の方法を見つけました。

// In the AppDelegate
- (void)applicationWillResignActive:(UIApplication *)application
{
    if ([self.window.rootViewController isKindOfClass:[GameViewController class]]) {
        GameViewController *vc = (GameViewController*)self.window.rootViewController;
        [vc pauseGame];
        [vc.view addObserver:vc
                  forKeyPath:@"paused"
                     options:NSKeyValueObservingOptionNew
                     context:nil];
    }
}

// In the GameViewController
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    SKView *skView = (SKView*)self.view;
    MainGame *mainGame = (MainGame*)skView.scene;
    if ([keyPath isEqualToString:@"paused"] &&
        [[change objectForKey:NSKeyValueChangeNewKey] boolValue] == NO &&
        [mainGame isGameInProgress]) {
        [self.view removeObserver:self forKeyPath:@"paused" context:nil];
        skView.paused = YES;
    }
}
于 2014-09-21T16:31:35.003 に答える
-4

スプライト キットは、バックグラウンドに移動するときにアニメーション タイマーを自動的に一時停止します。そのためにアプリが強制終了されることを心配する必要はありません。

于 2013-09-25T23:18:52.983 に答える