もしかしたら大多数の人には常識なのかもしれないし、自分の知識が無いだけかもしれないですが
自分にはこの発想はなくてなかなか悩んでいたのでメモ。

Cocos2dでオブジェクトをどう構成するかの話です。

案1:CCSpriteを継承してオブジェクトを作る

一番考えやすく、一般的な方法がこちらです。

CCSpriteを継承してCharacterを作り、Characterを更に継承してPlayer、Enemyクラスを作ります。

案2:CCNodeを継承してオブジェクトを作る

先ほどの案1では オブジェクトは必ずCCSpriteを継承してしまい、is-a関係から外れてしまいます。

本来のis-a関係ではCCNodeを継承するべきです。

CCNodeを継承してCharacterを作り、Characterを更に継承してPlayer、Enemyクラスを作ります。
表示するためのCCSpriteはCharacterクラスが保持します。

こちらのほうが継承の形としては正しいのですが、これを考えるときに生じた問題が
「どうやってこのクラスを保持するのか」でした。

cocosではメンバ変数としてオブジェクトを保持するのは推奨されていません。
すべてaddChildで管理するのを推奨しています。

解決案

気づいたらすごい簡単なことでした。
親クラスがCharacterクラスをaddChildして、CharacterクラスがCCSpriteをaddChildすればよかったのです。

UIViewの概念がつよく、viewをadd出きるのはviewのみという印象で
CCSpriteをaddできるのはCCSpriteのみと勘違いしていました。

cocos2dではCCNodeに対してCCSpriteをaddすることも出来ます。
CCNodeに対してaddChildすることでオブジェクトを保持しつつ、きちんとCCSpriteを操作することもできるようになりました。

ちなみに

今回のクラス図はyumlというサイトで作ってみました。
かんたんで綺麗なクラス図が作れますよ!

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>