昨日の記事の続きです。
昨日は連射した弾丸と次々現れる敵の衝突判定をするのに、functionではなくてクラスを使うとプログラムをシンプルにできるという記事を書きました。
今回は少し応用編として、継承を利用した方法について。
白くまからサッカーボール(Ballクラス)を連射し、男の子のクマ(T_Boyクラス)か女の子のクマ(T_Girlクラス)に当たったかどうかを判定するとします。
この場合も、衝突判定は前回と全く書き換えていません。
// BallクラスとTargetクラスの衝突判定
Ball.intersect(Target).forEach(function(pair)
{
//pair[0]: Ballのインスタンス
//pair[1]: Targetのインスタンス
game.rootScene.removeChild(pair[0]);
game.rootScene.removeChild(pair[1]);
});
BallクラスとTargetクラスが当たっているかを判定しているだけです。
なぜこのようなことができたかというと、ポイントは、男の子のクマ(T_Boyクラス)と女の子のクマ(T_Girlクラス)は、Targetクラスの子孫として記述したことです。
// ターゲットクラス
var T_Boy = Class.create(Target, {initialize:function(){
Target.call(this);
this.frame = 1;
}});
var T_Girl = Class.create(Target, {initialize:function(){
Target.call(this);
this.frame = 11;
this.speed = 3;
}});
Targetクラスが親、T_BoyクラスとT_Girlクラスが子孫なので、この3つをまとめて親の名前を取ってTargetクラス一族と呼ぶことにしましょう。
つまりBallクラスとTargetクラス一族が当たっているかを判定していることになるのです。
Targetクラスが親、T_BoyクラスとT_Girlクラスが子孫のような関係を、オブジェクト指向プログラミングでは継承といいます。
Targetクラスがスーパークラス、T_BoyクラスとT_Girlクラスがサブクラスです。
特にT_BoyクラスとT_Girlクラスに派生させなくてもTargetクラスだけあれば同様の処理はできなくはないです。なぜあえて派生をつかうのでしょう。
それは、衝突判定はもちろんその後の処理の記述効率がとても良いからです。
例えばTBoyとT_Girlにボールがヒットしたときに得点が加算されるとします。さらにT_BoyとT_Girlでは加算されるポイントが異なるともします。
もし派生を使わない場合、衝突を感知するたびに「当たったのは男の子なのか女の子なのか」をメンバ変数などを使って条件分岐する処理を書いておく必要があります。
しかし同じ親から派生した別々のクラス、まるで兄弟のようなクラスにしておけば、共通の部分は親クラスに、異なる部分は子クラスそれぞれに記述できます。
少しまだ雑な説明ですが、クラスと継承が分かるとオブジェクト指向プログラミングがとても面白くなります。
もう少し追記かリライト、または別記事で、もう少し丁寧に説明できるといいですね。。。がんばります。
全てのサンプルはこちらにあります。
http://code.9leap.net/codes/show/143744