Memorandum

自分へのメモ。そして誰かの役に立てば、うれしい。

cocos2d-xでゲームを作ろう! 第八回 キャラクタを増やそう編

今週はDocomoからiPhoneも発売されて、ますますスマフォユーザーの比率が上がってきますね。早くなにかゲーム作ってAppStoreに公開してみたいです!
まっ、その前に勉強、勉強。

クラスを作ろう!

さて、キャラクタ一人ではちょっとさ淋しいので、キャラクタ追加して表示してみようと思います。ただ、今のままだとコードも重複してスゴく見通しが悪いし、拡張性もないですよね。なので、まずは、キャラクタ表示部分をクラス化しましょうー。

Humanクラスを作ろう!

以下のクラスを作成しました。人間を表す「Humanクラス」です。

cocos2d::CCNodeから派生しているのは、autorelease()などのcocos2dのベースの概念に沿って作っていこうと思ったからです。
たぶん、今の段階ではその恩恵は受けてないです。継承しなくても問題ないと思います。

作成したHumanクラスをインスタンス化しよう!

生成処理は以下の通りです。

生成するときは、テクスチャファイルを渡します。いちお、テクスチャアトラスで渡しますが、どのように配置されているかは決めうちです。
受け取ったテクスチャファイルは、initWithFile()メソッドに渡します。

テクスチャを処理しよう!

テクスチャを受け取った画像関連の処理は以下のメソッドで処理します。

ここでテクスチャアトラスからテクスチャを切り出して、アニメーションを構築します。スプライトの生成もここでやっておきます。基本的には、以前やっていた主人公表示用の処理のコピペです。

どうやって表示しよう。。。

ここが今回一番悩んだ部分です。CCSpriteを保持する事は当初から決めていたのですが、それをどうやってレイヤーに追加すれば良いんだろうと。HumanクラスはCCSpriteを継承していないので、レイヤーにaddChild()しても何も意味はありません。そういうことを考えていると、CCSpriteを継承するべきなんだろうかとか色々と考えてしまいました。

レイヤーへの登録は以下の処理で行います。

結局、このメソッドみたいに追加したい親のCCNodeのポインタを受け取ったら良かったんですよね。頭が固かったです。いかん、いかん。

あと、ちょっとハマったのが、座標の指定方法です。Humanクラスは、CCNodeを継承しているからsetPosition()も使えるんです。でも、それで指定した座標は、Humanクラス自体の座標であって、保持しているCCSpriteの座標ではないんですよね。なので、保持しているCCSpriteに座標を設定してやるために、setPosition()メソッドを定義して、その中で、CCSpriteのsetPosition()を呼んでやります。

作成したHumanクラスを呼び出そう!

こんな感じで呼び出します。すっきりしましたね!

できた!

f:id:Keizi:20130922212004p:plain

これで淋しくないですね!でも、3人並んだままで、まだちょっと淋しいですね。NPCというからには動き回ってほしいでしょうね。次回はそれにチャレンジしてみます!