5月 11
16
OpenGL ESのRetina対応
Taiatari HeroのRetina対応をしてみたので気づいたことをメモ。
私がiPhone 4を持っていないためRetina対応しても確認が出来ないので、いままでTaiatariもRetina対応を見送ってたのですが、シミュレーターでもハードウェアの設定をRetinaのiPhoneにすれば動作確認が出来ることに今更ながら気づいたので、やってみることにしました。
Taiatari Heroではプレイ画面でOpenGL ESを使っています。
OpenGLを使っていないタイトル画面などはRetina用と通常用で別々に画像ファイルを用意しておけば良いので特にどうということは無いですが、OpenGLに関しては若干プログラム側の対応が必要になります。
といっても、肝になるのは下記のコード追加。
self.view.contentScaleFactor = [UIScreen mainScreen].scale;
eaglLayer.contentsScale = [UIScreen mainScreen].scale;
これだけでした。
eaglLayer.contentsScaleは通常は1のようですが、Retinaの場合は解像度2倍なので2にします。
この値は[UIScreen mainScreen].scaleで取得できます。
あとは、解像度に依存する処理があれば対応が必要になりますが、Taiatari Heroでは、glViewportの所くらいでした。
screenWidth = frame.size.width * [UIScreen mainScreen].scale;
screenHeight = frame.size.height * [UIScreen mainScreen].scale;
glViewport(0, 0, screenWidth, screenHeight);
これで、シミュレーターで動かしてみるとちゃんとRetina対応しているのが分かりました。
ゲーム内で使用しているテクスチャが無理矢理2倍のサイズに引き延ばされるのではなく、ちゃんときれいに描画されています。
もちろんベースとなる画像ファイルが、高解像度に対応していればですが。
ところで、面白いのはiPadで動かした場合です。
Taiatari Heroはユニバーサル対応していないので、iPadで動かすとピンぼけの2倍モードで動かせますが、この場合[UIScreen mainScreen].scaleは1を返します。
当然ながら実際の動作は今まで通り、画像が2倍に引き延ばされてピンぼけ表示になります。
で、下記のようにしてみました。
//retina対応
self.view.contentScaleFactor = [UIScreen mainScreen].scale;
eaglLayer.contentsScale = [UIScreen mainScreen].scale;
screenWidth = frame.size.width * [UIScreen mainScreen].scale;
screenHeight = frame.size.height * [UIScreen mainScreen].scale;
//iPad
if ([[UIDevice currentDevice].model isEqualToString:@”iPad”]) {
self.view.contentScaleFactor = 2;
eaglLayer.contentsScale = 2;
screenWidth = frame.size.width * 2;
screenHeight = frame.size.height * 2;
}
[UIDevice currentDevice].modelでデバイスがiPadかどうかを判定してiPadの場合は無理矢理eaglLayer.contentsScaleに2をセットしてみました。
結果、iPadで2倍モードにしてもきれいに画面が表示されるようになりました。
これなら、OpenGLを使ったアプリなら苦労してユニバーサルアプリにしなくても良いかもしれないなあ。
ちなみにシミュレーターで動かした場合は、[UIDevice currentDevice].modelは”iPad”と返してくれないので実機でしか動きません。
実際にiPadのきれいな画面でTaiatari Heroを遊んでみたら面白かった。
子供たちはiPadの方がいいそうです。
Taiatariは本体を傾けて操作するのでiPhone向きゲームと思っていたけど、iPadの広い画面もいい。画像がきれいになると、不思議とゲーム自体が面白さ倍増します。
長時間遊ぶと腕が疲れそうですが。