トップページへ戻る
つくれる?iPhoneアプリ
cocos2dを使ってPHPぐらいはわかるプログラマーに解説してみる

クラスの解説


どのページでも
ご自由にリンクしてください。

感想ご要望はお気軽に!
info@taskinteractive.com


■順番に解説
・導入
その1
導入


その2
HelloWorld


その3
わからない単語でも安心


その4
いじるファイルと画面構成


その5
ソースにある単語を手探る


その6
実行の順を追って手探る


その7
クラスの名前と素性を手探る


・サンプル1
その8 ボール遊び1
Scene/Layer/Sprite


その9 ボール遊び2
ファイル名を変えてみる


その10 ボール遊び3
ソースをいじってみる



■項目ごとに解説
クラスの解説
その1 クラスって何?


クラスの解説
その2 インスタンスって何?


クラスの解説
その3 オブジェクト指向って何?




企画・販売元タスクインタラクティブ


被り物を被ってクラスの処理表を持ったあいつがオブジェクト

正確には、インスタンスオブジェクト。


クラスから生成したのがインスタンスでしたね!


インスタンスオブジェクトは、外からのメッセージを受け取ると、そのクラスに書かれた処理表に照らして処理をします。

言い方を変えると、生成されたインスタンスは、クラスメソッド・・・じゃなかった、インスタンスメソッドに対応するメッセージを受け取り、メソッドに定義された処理を行います。



クラスメソッドとインスタンスメソッド

そんなに意識して覚える必要は無いことですが、簡単に説明すると…

クラスの解説 その1 クラスって何? の、
最後の項目で、親方君は、クラスの処理表を見せながらコロ君に指示を出していましたね。

クラスのまま、インスタンス化せずに使用するメソッドを、クラスメソッドといいます。
それに対して、インスタンス化してから使用するメソッドを、インスタンスメソッドといいます。


プラスとマイナス、というと、思い当たるかもしれません。


+(id) scene;   これはクラスメソッド

-(id) scene;   これはインスタンスメソッド



もうちょっと説明すると、

インスタンスを生成する前に、インスタンスを生成するために使用する、

+(id) alloc;   これはクラスメソッド


生成した後初期化する、

-(id) init;   これはインスタンスメソッド






コロ君で言うと、『ボール7』というあだ名(インスタンス名)呼ばれ、『おーい、ボール7よー。xのyに移動してー』といわれると、親方から渡されたクラスの処理表を見て、『移動(x,y)をすればいいんだな』と理解し、その場所に移動する、という感じです。




逆に、クラスの処理表に書かれていない、つまり、インスタンスメソッドとして定義されていないメッセージを受け取っても、何もしません。





と、ここまでは一人一生懸命いろいろな人に指示を出していた親方君ですが、次の『オブジェクト指向はメッセージの投げ合い』からは、何もしません。
その違いを見てください。







オブジェクト指向の利点はメッセージの投げ合い

さて、今は『ボール7』の役割を与えられてステージにあがるコロ君ですが、当然ビリヤードは沢山の玉を使います。
ということは、『ボール2』や『ボール9』を演じているほかの動物もいるはずです。

見てみましょう。




フクロテナガザルのリッキー君が『ボール2』に、ワタボウシパンシェ(ワタボウシタマリン)のリリー君が『ボール9』に指名されました!

ちなみにコロ君はニシローランドゴリラ、親方君はニホンザルです。





さて、、

先ほどまでは、親方君がコロ君を含む皆に対し、一人で一生懸命指示を出していました。
いまは、ステージの上でそれぞれが役割を担っています。


ビリヤードはステージの上で玉と玉とがぶつかって移動するゲームです。
玉と玉とがぶつかったとき、どのように処理すればいいでしょう。



・親方君がすべてのボールの動きを監視していて、ぶつかった瞬間にその2つのボールに指示を出すのも、ひとつの方法です。


・別の方法として、ぶつかった玉が、その相手の玉と情報交換し合い、移動方向などを変える、というのもひとつの方法です。




後者のようなつくりが、オブジェクト指向的な設計です。
実際のゲームで見てみましょう。



試合開始ー

いよいよ、ゲームが始まりました。
はたから見ていると、ゲームのスタートのときはなにやら親方君が指示を出したりしていましたが、その後はほとんど指示を与えることがありません。

その代わり、ボール役(インスタンスオブジェクト)それぞれが、ボール同士でぶつかったりする度に『処理表』を見ながらお互いに何かを伝え合い、進行しています。



ちょっとそのうちの一場面、『ボール7』と『ボール2』がぶつかった場面を見てみましょう。

静止しているニシローランドゴリラに、フクロテナガザルが激突する、なんていうことが野生で起こったら大変なことになりますが…




『ボール7』が静止しているところに、『ボール2』が転がってきて、いままさに衝突しようとしています。

ぶつかった!その瞬間に、


『ボール2』から『ボール7』へのメッセージ
「いま君と僕とはぶつかる!君の現在の“x座標”と“y座標”と“動いている方向”と“速度”を教えて!」

『ボール7』から『ボール2』への返答
「x座標は120 y座標は100、動いていないから方向は0で、速度も0だよ!」

 返答を受け、処理表を見て計算する『ボール2』。そして再び

『ボール2』から『ボール7』へのメッセージ
「君はそこから、223度の方向に、20の速度で移動を始めて!」

『ボール7』から『ボール2』への返答
「了解!」



この間、親方が口を挟んだり、指示を出したりすることはありませんでした。
ボールというインスタンスオブジェクトがぶつかり合うたび、このように互いに情報を交換しながら、スムーズにゲームが進んでいったのです。




オブジェクト同士のメッセージの投げあい

これが、オブジェクト指向の処理のひとつのカタチです。


なんとなくお分かりいただけたと思いますが、別の疑問も出てくると思います。
その詳細な解説は別の機会にするとして、ちょっと先回りして疑問になりそうな点を上げてみると…

・どのタイミングで衝突の判定をするの?
 →1秒間に60回とかでタイマーをまわしておいて、そのタイミングで各オブジェクトに衝突状況の判定をさせたりする方法などがあります。

・ぶつかった後の移動は、永遠に続いてしまわないの?
 →移動中は移動を処理するルーチンに留めておき、そのルーチン内で速度を減少させていく、という方法や、前述のようなタイマーからメッセージが来るたびに、自身の移動速度などを再計算して減少させていく方法などがあります。


上記はあくまで一例です。
処理はいろいろな方法がありますので、今の段階で思いつく疑問は、大体解決方法がそのうち見つかるから大丈夫、ぐらいに思っておいてください。