さて、とりあえずある程度慣れてきたので本格的にiPhoneアプリを作ってみようと思い次の本へ手を出しました。
- 実践iPad/iPhoneゲームプログラミング/沼田 哲史

- ¥2,940
- Amazon.co.jp
これです。
この本を読めばとりあえず基本的なゲームが作れるようになります。
僕が作りたいゲームは
FlickShooting
これです。
とりあえず、買ってゲームをして良い評価のレビューを書いてくれればと思いますが(笑
このゲームを作るイメージを持って先ほどの本を読みました。
序盤はiPhoneの機能を使って出来る落ちものゲームの解説がありました。
OpenGLとかを使わなくてもこれだけのゲームが作れるという事を学びました。
さて、ここでは僕が学んだ事を説明します。
僕が一番始めに気になったのがパス。Xcodeではフォルダ(ディレクトリ)の概念がありません。グループと言う概念しか無いのでパスで悩む事が無いのです。なので、違うグループに所属しているファイルでも同じ名前を使う事ができません。(結局全て同じフォルダに入っている為)
この概念はなかなか理解に苦しんだが、慣れるとパスで悩む事が無くなるので小さいアプリでは楽だった。
⇒この概念には慣れとかないとファイル管理が上手く出来ないので、この時点で色々グループを試して慣れておくと良い。
info.plist。
これはiPhoneなどのアプリを作る上での基本設定を行うファイルです。ステータスバーを消したりアイコンやファイル名等を管理しています。iPhoneアプリを公開する上で必ず変更する必要があるものもある。
マルチタスクを有効にするかしないかもここで設定出来る。
⇒僕は必要に応じてgoogle先生に聞いて変更しているので、項目は殆ど覚えてない。
とりあえず、iPhoneの教科書を読めばXibファイルの操作に悩む事は無いだろう。画面遷移に関してもコードを見れば分かるレベルである。(XCode4.2.2からはそれすらもUIで行える。)
ここで重要なのは画面遷移のコード。音を出すコードだ。それ以外は僕の作るゲームでは殆ど使わない予定だった。
ただし、最後にアニメーションは使う事になったのでこのアニメーションのコードは覚えておくべきだろう。
(それにしても、アニメーションのコードはもう少し奇麗に書けるように出来ないだろうか?言語仕様上しょうがないかもしれないけれど、中括弧やインデントを駆使してもう少し簡単にしてくれればと思う。)
画面遷移のコード(FlickShootingでいうギャラリーを表示する場合)
GalleryListViewController *controller = [[GalleryListViewController alloc]initWithNibName:@"GalleryListViewController" bundle:nil];
controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:controller animated:YES];
[controller release];
大抵のゲームには画面遷移があるので、このコードは覚えておくと良いだろう。
始めに次の画面のコントローラーのインスタンスを生成します。allocで生成して、Nibファイルの指定をしてます。
そのあと、画面遷移のアニメーション(UIModalTransitionStyleFlipHorizontal)を設定する。この場合はくるっと回るアニメーションである。
そして、こちらをモーダル(presentModalViewController)で呼び出してます。
そのあとのreleaseはよく分からないけど、おそらくモーダルで呼び出す時にretainしているのだと想定。
あ、あとretainとreleaseの関係については覚えておく必要がある。というのも、objectiv-cにはガベージコレクトが存在しないためインスタンスを生成(alloc)した場合は自分で解放(release)しなければならないのだ。不慣れのうちはautoreleaseと言うものが存在するのでそちらを利用しよう!
allocしたオブジェクトはその時点で参照カウンタに1がセットされている。このオブジェクトに対してreleaseを行うと参照カウンタが0になりメモリが解放される。なので、allocとreleaseは必ずセットになる。
しかし、releaseすると必ず参照カウンタが0になるかと言うとそうではない。それがretainである。このretainを使うと参照カウンタを増やす事が出来る。すなわち
alloc⇒retain⇒releaseとされてもメモリが解放されない。もう一回releaseを行う必要がある。そう考えるとretainって何に使うんだろうか?と言うと、上記の例のように自分のプログラムでは使わないけど他のプログラムが使っている時にreleaseされないようにする為の仕掛けである。
(XCode4.1から「Use Automatic Reference Counting」が使えるようになったため、メモリ管理をプログラマーが意識する必要は無くなった。)
上記の例ではメインプログラムではcontrollerをallocしてその後にreleaseしている。もし、これでメモリが解放されてしまったらギャラリー画面は一瞬しか表示されない事になる。しかし、実際にはこのコードでギャラリー画面は表示されている。このように自分のプログラムでは使わなくなっても他で使っている時にメモリが解放されないようにretainを使っているのだ。ここではpresentModalViewControllerがretainをしていると想像。そしてdismissModalViewControllerAnimatedでreleaseしているかと思う。(コードは追ってません。)
よくよくコードを理解するととても単純な構造である。allocすると参照カンターが1で作成されてretainすると参照カウンターが1増える。releaseすると参照カウンターが1減って0になるとメモリが解放される。オブジェクト指向でコード書けば管理出来るが、手続き型で書くと参照カウンターの数を調整するのが至難の業である。。。
と言う事で、画面遷移のコードを覚えました。
次回へ続く。(作ったものが気になる人は是非ご購入お願い致します!)
【今だから分かる事】
IOS5で使える「Use Automatic Reference Counting」を使えばretainはもう覚える必要はもう無いんだよね・・・.