くまちゃんのiOS/Androidゲームプログラミング

マイペースでゲームつくってます。

ゲームのiOS画面サイズ対応策【Sprite Kit, iOS8】

突然ですが、iPhone6が出てからずーっと個人的に課題になっていた問題の一応の対応策ができましたのでメモします。

【ここ数ヶ月密かに悩んでいた課題】
・ゲームは320x480ピクセルで画面をつくっている。iPhone4s以前ならちょうどいいサイズ。
iPhone5で縦サイズが長くなった->画面下にバナーを出すことでしのぐ。リジェクトもされない。
iPhone6,6+ではさらに横サイズも大きくなった->いやもう勘弁して。

いままで動いていたコードをそのまま使うと以下のような悲劇が。(シミュレーターのスクショ)
iPhone4s
f:id:tadakazu1972:20150119220939p:plain
iPhone5
f:id:tadakazu1972:20150119221033p:plain
ここまではいい、ここまでは。
iPhone6
f:id:tadakazu1972:20150119221105p:plain
iPhone6+
f:id:tadakazu1972:20150119221125p:plain
どおせええっちゅうねんんんんんんんん!
しばらく放置していました。

そしてAndroidアプリ開発に手を出していて、Sprite Kitもスケールをいじればなんとかなるんじゃ?と閃いて、しばらくGooglingしてイロイロ試していたらなんか対応できました。

GameViewController.mで

- (void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];

    // Configure the view.
    SKView * skView = (SKView *)self.view;
    
    //set the view only once, if the device orientation is
    // rotating viewWillLayoutSubviews will be called again
    if (!skView.scene)
    {
        skView.showsFPS = NO;
        skView.showsNodeCount = NO;
        /* Sprite Kit applies additional optimizations to improve rendering performance */
        skView.ignoresSiblingOrder = YES;
        
        CGSize gameSize;
        gameSize.width=320;
        if (skView.frame.size.height>480){
            //iPhone5以降
            gameSize.height=568;
        } else {
            //iPhone4s
            gameSize.height=480;
        }
    
        // Create and configure the scene.
        GameScene *scene = [GameScene sceneWithSize:gameSize];
        scene.scaleMode = SKSceneScaleModeAspectFill;
    
        // Present the scene.
        [skView presentScene:scene];
    }
}

iPhone6
f:id:tadakazu1972:20150119221832p:plain
iPhone6+
f:id:tadakazu1972:20150119221907p:plain

ポイントは、勝手に画面サイズをつくってそれをsceneWithSizeでどかんと放り込むという、わかっちゃえばダイレクトかつシンプルな策でしたとさ。
これでちょっとモチベーション回復!