私はコード内のあらゆる場所を検索しようとしました:バックグラウンドに移行したときの動作を説明したドキュメント、または一時停止した場合でも役に立たない-バックグラウンドに移行するときに推奨される方法を誰かが教えてくれますか?スプライトキット対応ゲーム?
または、バックグラウンドで描画が行われないことを確認して、iOSによる終了を回避できるようscene.paused = YES
にするにはどうすればよいですか?
ありがとう!
私はコード内のあらゆる場所を検索しようとしました:バックグラウンドに移行したときの動作を説明したドキュメント、または一時停止した場合でも役に立たない-バックグラウンドに移行するときに推奨される方法を誰かが教えてくれますか?スプライトキット対応ゲーム?
または、バックグラウンドで描画が行われないことを確認して、iOSによる終了を回避できるようscene.paused = YES
にするにはどうすればよいですか?
ありがとう!
ここで言ったように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 に含まれる予定です。
この一見単純な解決策がなぜアプリの起動時にクラッシュを引き起こすのか不思議に思っていましたが、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;
}
}
私にとっては、提供されたソリューションのどれも機能しませんでした。私はそれを行う別の方法を見つけました。
// 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;
}
}
スプライト キットは、バックグラウンドに移動するときにアニメーション タイマーを自動的に一時停止します。そのためにアプリが強制終了されることを心配する必要はありません。