2.クラスの継承
teki1、teki2、teki3と言ったように、似たようなクラスをたくさん作成された方は多いと思います。シューティングの場合、まっすぐ降りてくる敵、斜めに移動してくる敵、挙動不審な敵などなど様々な敵を作成されたことと思います。
---------------------------------------------------------------
teki1.tonyu
---------------------------------------------------------------
extends SpriteChar; function onDie() { appear(new Bomb(x , y ,$pat_bomb+0)); }
function atariHantei() { for (t in $chars) {
if ( ((t is Tama)||(t is Tama2)||(t is Jiki)) && crashTo(t) ) {
if (t is Jiki) { //自機と接触した場合
t.die(); //自機を爆破 die(); //敵を爆破
}
else { hp=hp-1; //hpが1減る
$score=$score+1; //Scoreに10ポイント加算
t.die(); //弾を消す
if (hp<1) die(); //hpが1未満の場合はdie()を呼ぶ
}
}
}
}
while (y<$screenHeight) { y+=1; atariHantei(); update(); }
---------------------------------------------------------------
---------------------------------------------------------------
teki2.tonyu
---------------------------------------------------------------
extends SpriteChar; function onDie() { appear(new Bomb(x , y ,$pat_bomb+0)); }
function atariHantei() { for (t in $chars) {
if ( ((t is Tama)||(t is Tama2)||(t is Jiki)) && crashTo(t) ) {
if (t is Jiki) { //自機と接触した場合
t.die(); //自機を爆破 die(); //敵を爆破
}
else { hp=hp-1; //hpが1減る
$score=$score+1; //Scoreに10ポイント加算
t.die(); //弾を消す
if (hp<1) die(); //hpが1未満の場合はdie()を呼ぶ
}
}
}
}
while (y<$screenHeight) { y+=1;
if (x<$myChar.x) x+=1;
else x-=1; atariHantei(); update(); }
---------------------------------------------------------------
これで、teki1とteki2は完成です。めでたしめでたし・・・。
と、言いたいのですが、
「同じ操作が繰り返されていると思ったときには、プログラムを短くするチャンスだと思ってください。」
おわかりいただけるかと思いますが、クラスはまたがっているものの、function onDie()とfunction atariHantei()は同じ操作を2度繰り返してあります。
このような場合に、「クラスの継承」という概念が必要になります。名前は複雑そうですが、行うことは簡単です。
- Superクラス(親クラス)の作成
- Childクラス(子クラス)のextendの後ろ側を親クラスのクラス名に変更
- 子クラスのFunctionを削除
---------------------------------------------------------------
teki.tonyu
---------------------------------------------------------------
extends SpriteChar; function onDie() { appear(new Bomb(x , y ,$pat_bomb+0)); }
function atariHantei() { for (t in $chars) {
if ( ((t is Tama)||(t is Tama2)||(t is Jiki)) && crashTo(t) ) {
if (t is Jiki) { //自機と接触した場合
t.die(); //自機を爆破 die(); //敵を爆破
}
else { hp=hp-1; //hpが1減る
$score=$score+1; //Scoreに10ポイント加算
t.die(); //弾を消す
if (hp<1) die(); //hpが1未満の場合はdie()を呼ぶ
}
}
}
}
---------------------------------------------------------------
---------------------------------------------------------------
teki1.tonyu
---------------------------------------------------------------
extends teki;
while (y<$screenHeight) { y+=1; atariHantei(); update(); }
---------------------------------------------------------------
---------------------------------------------------------------
teki2.tonyu
---------------------------------------------------------------
extends teki;
while (y<$screenHeight) { y+=1;
if (x<$myChar.x) x+=1;
else x-=1; atariHantei(); update(); }
---------------------------------------------------------------
このようにすることで、Programを見やすく、後の変更も容易になります。処理速度は遅くなるようなことはありません。また、クラスの継承はteki3、teki4などクラスの数が増えてきた時にその威力を発揮します。
発展・・・(最上級者のみ)
オーバーライドとは、Super Classで定義したメソッドをSub Classで再定義することです。この場合、Super
Classのメソッドを参照したい場合には
super.MethodName(Args,...);
のようにして使用してください。static関数ではありませんが静的束縛の隠蔽を行う事が可能です。動的束縛は起りません。実際には使う必要性はあまり生じないと思います。
|