トップ


クラスの継承
(Enemy.tonyuをSuperクラスにして、skyBlue.tonyuを作成する)


skyBlue.tonyuを作成する

先に作成したEnemyとYellowとRedのプログラムを見てみましょう。

Enemy.tonyu
extends SpriteChar;
function onDie() {
  appear(new Bomb(x , y ,$pat_Sample+4));
}
function atariHantei() {
  for (t in $chars) {
   if ( t is Tama && crashTo(t) )  {
     die();
     t.die();
     $score=$score+10;
   } 
  }
  if (crashTo($myChar)) $myChar.die();
}
nexty=rnd(50)+100;
while (y<nexty) {
  y=y+2;
  atariHantei();
  update();
}
if (x>$myChar.x) vx=2; else vx=-2;
while (y<$screenHeight+15) {
  y=y+3;
  x=x+vx;
  if(x<15 || x>$screenWidth-15) vx=-vx;
  atariHantei();
  update();
}

Yellow.tonyu
extends SpriteChar;
function onDie() {
  appear(new Bomb(x , y ,$pat_Sample+4));
}
function atariHantei() {
  for (t in $chars) {
   if ( t is Tama && crashTo(t) )  {
     die();
     t.die();
     $score=$score+10;
   }
  }
  if (crashTo($myChar)) $myChar.die();
}
i=0;
d=1;
while (y<$screenHeight+15) {
  i++;
  y=y+1;
  x=x+d*sin(8*y)*10;
  if(x<15 || x>$screenWidth-15) d=-d;
  atariHantei();
  if(p==$pat_Sample+8) vp=1;
  else if(p==$pat_Sample+10) vp=-1;
  if(i%20==0) p=p+vp;
  update();
}

Red.tonyu
extends SpriteChar;
function onDie() {
  appear(new Bomb(x , y ,$pat_Sample+4));
}
function atariHantei() {
  for (t in $chars) {
   if ( t is Tama && crashTo(t) )  {
     life=life-1;
     if(life<=0) {
       die();
       $score=$score+30;
     }
     t.die();
   }
  }
  if (crashTo($myChar)) $myChar.die();
}
life=3;
i=0;
d=1;
if(x<$myChar.x) direction=1;
else direction=-1;
while (y<$screenHeight+15) {
  i++;
  y=y+1;
  x=x+d*(sin(16*y)*10+direction);
  if(x<15 || x>$screenWidth-15) d=-d;
  atariHantei();
  if(p==$pat_Sample+11) vp=1;
  else if(p==$pat_Sample+13) vp=-1;
  if(i%20==0) p=p+vp;
  update();
}

カラーをつけた部分は非常に似ています。これをメソッドのようにどこかでまとめられないのでしょうか。
まとめると、プログラムは見やすくなる上、後で変更したり敵を増やしたりするときに便利そうです。

クラスの継承を使ってみましょう。
クラスの継承についてはTonyuLABのTonyu Program Techでも説明してありますので参考にしてみてください。

参照:
Tonyu Program Tech-クラスの継承
Tonyu System-命令リファレンス -extends

まず、新しいオブジェクトを作成して、skyBlueと言う名前にしてEnemyの内容のメソッド以外をコピーします。
次にextendsの後ろをSpriteCharからEnemyに変えてみましょう。

skyBlue.tonyu
extends Enemy;

nexty=rnd(50)+100;
while (y<nexty) {
  y=y+2;
  atariHantei();
  update();
}
if (x>$myChar.x) vx=2; else vx=-2;
while (y<$screenHeight+15) {
  y=y+3;
  x=x+vx;
  if(x<15 || x>$screenWidth-15) vx=-vx;
  atariHantei();
  update();
}

Enemyには、メソッドだけをおいておきましょう。

Enemy.tonyu
extends SpriteChar;
function onDie() {
  appear(new Bomb(x , y ,$pat_Sample+4));
}
function atariHantei() {
  for (t in $chars) {
   if ( t is Tama && crashTo(t) )  {
     die();
     t.die();
     $score=$score+10;
   } 
  }
  if (crashTo($myChar)) $myChar.die();
}

YellowはEnemyとまったく同じメソッドを持っているのでSpriteCharをEnemyに変えてメソッドを削除してしまえば終わりです。

Yellow.tonyu
extends Enemy;

i=0;
d=1;
while (y<$screenHeight+15) {
  i++;
  y=y+1;
  x=x+d*sin(8*y)*10;
  if(x<15 || x>$screenWidth-15) d=-d;
  atariHantei();
  if(p==$pat_Sample+8) vp=1;
  else if(p==$pat_Sample+10) vp=-1;
  if(i%20==0) p=p+vp;
  update();
}

Redはメソッドがまったく同じではありません。lifeがあります。そこで、Enemyの内容をRed.tonyuの内容に変えてしまいましょう。
また、skyBlueやYellowも得点が30点となりそうなので、markという変数も用意しておきましょう。

Enemy.tonyu
extends SpriteChar;
function onDie() {
  appear(new Bomb(x , y ,$pat_Sample+4));
}
function atariHantei() {
  for (t in $chars) {
   if ( t is Tama && crashTo(t) )  {
     life=life-1;
     if(life<=0) {
       die();
       $score=$score+mark;
     }
     t.die();
   }
  }
  if (crashTo($myChar)) $myChar.die();
}
Red.tonyu
extends Enemy;

mark=30;
life=3;
i=0;
d=1;
if(x<$myChar.x) direction=1;
else direction=-1;
while (y<$screenHeight+15) {
  i++;
  y=y+1;
  x=x+d*(sin(16*y)*10+direction);
  if(x<15 || x>$screenWidth-15) d=-d;
  atariHantei();
  if(p==$pat_Sample+11) vp=1;
  else if(p==$pat_Sample+13) vp=-1;
  if(i%20==0) p=p+vp;
  update();
}

これでRedにも継承を適用しましたが、skyBlueとYellowにはlifeがありませんので無敵のような状態になってしまいました。
(実際には、null値が入ってskyBlueもYellowも一発で死にます。しかし、scoreもnull値になるためスコアに加算されません。)
そこで、skyBlueとYellowにはlife=1の一文を付け足してあげましょう。また、得点を10点に戻してあげましょう。

skyBlue.tonyu
extends Enemy;


mark=10;
life=1;
nexty=rnd(50)+100;
while (y<nexty) {
  y=y+2;
  atariHantei();
  update();
}
if (x>$myChar.x) vx=2; else vx=-2;
while (y<$screenHeight+15) {
  y=y+3;
  x=x+vx;
  if(x<15 || x>$screenWidth-15) vx=-vx;
  atariHantei();
  update();
}
Yellow.tonyu
extends Enemy;

mark=10;
life=1;
i=0;
d=1;
while (y<$screenHeight+15) {
  i++;
  y=y+1;
  x=x+d*sin(8*y)*10;
  if(x<15 || x>$screenWidth-15) d=-d;
  atariHantei();
  if(p==$pat_Sample+8) vp=1;
  else if(p==$pat_Sample+10) vp=-1;
  if(i%20==0) p=p+vp;
  update();
}

これで一見落着と行きたいところですが、UFOはいまだにEnemyを出しつづけています。これでは、skyBlueは出て来れません。

UFO.tonyu
extends SpriteChar;


function appearEnemy() {
   if (rnd( 50 )==0) appear(new skyBlue(x,y,$pat_Sample+2));
   if (rnd( 100 )==0 && $score>100) appear(new Yellow(x,y,$pat_Sample+8));
   if (rnd( 200 )==0 && $score>200) appear(new Red(x,y,$pat_Sample+11));
}
while(1) {
 while(x<$screenWidth - 40) {
   x=x+2;
   appearEnemy();
   update();
 }
 while(x>40) {
   x=x-2;
   appearEnemy();
   update();
 }
}

これでクラスの継承は終わりです。プログラムの効率良くなり、見やすくもなりました。

次は、新しい敵を作成して、敵にも弾を撃たせて見ましょう。

  トップ