今回からは、iPhoneで動作するゲームアプリの作り方を解説しよう。ゲームでは、ユーテリティ系のソフトとは段違いの高いパフォーマンスでのグラフィック描画が求められる。そのために、画面描画にはOpenGLを用いることになる。その辺りから解説を行なっていこう。

題材として取り上げるゲームは、タワーディフェンスゲームだ。

タワーディフェンスゲームとは

タワーディフェンスは、リアルタイムストラテジーゲームの一種となる。マップ内にタワーがあり、それを侵略してくる敵から防衛するのが目的となる。敵は一定数が連続で攻め込んできて、これをウェーブと呼ぶ。敵を迎撃するために、砲台を各所に配置するのだが、これには資源が必要となる。限られた資源で、いかに敵のウェーブをいかに効率よく撃破するか。これがゲームのポイントとなる。

タワーディフェンスゲームの元祖と言われているのが、FlashゲームであるRoman SanineのTowerDefenseである。

TowerDefense

その後、多くのプラットフォームで多数の作品が登場した。iPhoneでも、タッチパネルの相性もよく、TapDefense、Fieldrunnersなど、たくさんのアプリがリリースされている。

TapDefense

グラフィックスフレームワークの選定

次に、iPhoneでゲームプログラミングを行なうときに気を付けるべき問題を考えよう。これはゲームに限らない事だが、アプリケーションの開発を始めるときは、目的に適したフレームワークを選定する事が大切である。

ゲームプログラミングで最も重要となるのは、グラフィック描画のパフォーマンスである。iPhoneでは、主に3つのグラフィッフレームワークが提供されている。Cocoa touchグラフィックス、Core Graphics(Quartz)、そしてOpenGLである。この3つを簡単に比較すると、次の表のようになる。

Cocoa Core Graphics OpenGL
Cocoaとの親和性
機能
パフォーマンス

まず、iPhoneアプリとのメインフレームワークであるCocoa touchとの親和性だが、もちろんこれはCocoa touchグラフィックスがいちばん高い。Core Graphicsも、CocoaのAPIを使って直接Core Graphics環境を取得することができるため、充分共存できる。これらに対してOpenGLは、Cocoaとの親和性はとても低い。Cocoaの描画とOpenGLの描画は、まったく別物と考え、また同一ビューで混合して使うのも避けた方がいい。

次に機能だが、汎用的なグラフィックスフレームワークの機能として考えると、Core Graphicsが一番高いと言える。例えば、様々な画像フォーマットのサポート、ベクトルベースの描画、フォントのサポート、PDFのサポートなどが含まれている。一般的なアプリケーションを作るために、重要な機能ばかりだ。これと比べると、OpenGLは3次元描画はサポートしているものの、他の機能は必要最低限に抑えられている。

ここまではOpenGLに対して辛口の評価であったが、もちろんこれらを補ってあまりある利点がある。それはパフォーマンスだ。OpenGLの描画パフォーマンスは、他の2つに比べて圧倒的に高い。ゲームのようなアプリケーションでは、これを最優先に判断すべきだろう。

このような理由で、今回はグラフィックスフレームワークとして、OpenGLを使うものとする。OpenGLのプログラミングスタイルは、Cocoaのものとはまったく違う。いままでこの連載で紹介してきたものとは、異なるプログラミングとなることだろう。

ただ、OpenGLは3次元グラフィックスのためのライブラリである。今回取り上げるタワーディフェンスは、2次元での描画が中心となるので、このターゲットに対してOpenGLを使うのを疑問に思う方もいるかもしれない。これはiPhone OSの実装によっているのだが、実は2次元描画であってもOpenGLの方がQuartzよりも速いのだ。今回のプログラミングでは、OpenGLをあえて2次元の平面で使うことになる。このテクニックは、次回以降詳しく説明していこう。

OpenGL環境のセットアップ

CocoaでOpenGLを使うための、環境のセットアップについて説明しよう。

iPhone OSでは、OpenGL ESを使うことができる。アプリケーションからこれを使うために、OpenGLES.frameworkが用意されている。このフレームワークには、EAGLで始まるObjective-Cのクラスがいくつか用意されている。たとえば、OpenGLコンテキストを管理するためのEAGLContextクラス、レンダバッファの描画属性を取得するためのEAGLDrawableプロトコルなどだ。ちなみに、「EAGL」は、Embedded Apple OpenGLの意味だと思われる。

CocoaとOpenGLをつなぐには、このようなクラスを使うことになる。だが、これを使いこなすには、OpenGLに対する深い知識が必要だ。そこで、もっと簡単に使う事ができるように、必要なセットアップをあらかじめ行なってくれるクラスが存在する。EAGLViewクラスだ。このクラスはUIViewのサブクラスであり、これをCocoaのビュー階層に貼付ける事で、そこでOpenGLの描画が可能となる。

ただ、このクラスはEAGLの名前で始まっているが、ドキュメント化されたOpenGLESフレームワークの一部ではない。どちらかというと、サンプルの一種として提供されているようなものだ。だがとても便利なものなので、これを利用する事にする。

EAGLViewを含むOpenGL環境をセットアップするには、テンプレートを使うのが一番簡単だ。Xcodeで新規プロジェクトを作成するとき、テンプレートとして「OpenGL ES Application」を選択しよう。ここにOpenGLを使うために必要なものが準備されている。

次回からは、このテンプレートを使ってプログラミングを進めていこう。