[cocos2d]ゲームオブジェクトとCCSpriteをis-aにするかhas-aにするか

Written by uechoco 2月 24
この記事を読む時間:156くらい

cocos2dでゲームオブジェクトクラス(プレイヤークラスだったりエネミークラスだったり)を作る時、CCSpriteはis-aにするのかhas-aにするのかが気になりました。

適当にググる。

海外の掲示板見る限り、初心者あるいは簡単なゲームはis-a、OOP派あるいは複雑なゲームはNSObjectかCCNodeにhas-aする案が多いかなという印象です。ちょっと古いけど結構有名そうなcocos2dの「Learn iPhone and iPad cocos2d Game Development」という本では、has-aを推奨していました。日本語版「cocos2dで作る iPhone&iPadゲームプログラミング
」もでているようです。cocos2dもバージョンアップしているので内容は古めなのかもしれませんが、cocos2dゲーム制作のエッセンスが詰まっているんじゃないかと思って買いたくなって来ました。

とりあえず、まずはis-aで簡単なゲームの作り方を学んでいこうと思います。すぐにhas-aで作りたくなってくるんじゃないかと思っています)

[cocos2d]nodeメソッドはalloc→init→autoreleaseのショートカット

Written by uechoco 2月 11
この記事を読む時間:333くらい

cocos2dでiPhoneのゲームを作るのが簡単!なんて話をたまに聞くもんだから、入門書を買ってきてとりあえず読んでます。

今までにもN88BASICやらVisualBasicやらHSPやらDelphiやらVisual C++やらProcessingやらでゲームもどきを作ってきたことはあるので、cocos2dの提供するクラス群がゲーム制作に有用だってことは割と早めに理解はしたものの、Objective-Cに馴染みはないのでゲーム制作のお作法は「おまじない」的に吸収している段階です。

さて、ライブラリなりフレームワークなりを学ぶにあたって理解を深める方法の一つに、フレームワークのソースコードを覗いてみるというのがあります。フレームワークというのはその言語や目的に詳しい人が作っていることが多いので、プログラミングの良いお手本であることが多いのです。cocos2dを通じて、Objective-Cへの理解を深めるというのも有りかなと思っています。

と前置きが長くなりましたが、本題。

cocos2dでは、CCLayer、CCScene、CCSpriteなど描画オブジェクトのことをノードと呼んでいるようで、いずれもCCNodeクラスの派生物となっています。またこれらのオブジェクトの生成メソッドはnodeという名前のメソッドに統一されています。一方で、初期化処理はinitメソッドに書くことになっており、nodeメソッドとinitメソッドの関係性が分からなかったので、フレームワークの中を覗いてみました。

まずはCCSpriteクラスを見てみました。しかしnodeメソッドはありませんでした。どうやら親クラスで実装されているようです。そのまま親クラスであるCCNodeクラスをみてみると、nodeメソッドの実装が見つかりました。nodeメソッドの実装を見てみると、initメソッドとの関係がわかりました。

[objc]
+(id) node
{
return [[[self alloc] init] autorelease];
}
[/objc]

initメソッドはnodeメソッドから呼ばれていました。同時に、メモリ確保らしきメソッドと自動メモリ解放らしきメソッドも呼ばれていました。これらのメソッドが何なのかググってみると、名前の通りのメソッドでした。

また、もう1つわかったことが有り、このalloc→init→autoreleaseを1行で行う構文は、Google Objective-Cスタイルガイド 日本語訳でも推奨されているbetterな書き方であるようです。メモリ解放のタイミングを自動化することで、若干のパフォーマンスを犠牲にしてメモリリークを防止することができるようです。

今回わかったこと

  • オブジェクトの生成と同じ行でautoreleaseする(alloc→init→autorelease)のはbetterな書き方である
  • cocos2dのソースコードはbetterな書き方で書かれているところがあり、Objective-Cを学ぶお手本になるかもしれない。
  • cocos2dではオブジェクトの生成をnodeメソッドに集約することで、フレームワークの使用者にメモリリークの心配事をさせない配慮=ゲーム制作だけに集中できるような配慮が見られる