トップ


敵に弾を撃たせる2
(Blue.tonyuを作成して、Ball.tonyuを連続して撃たせる)


Blue.tonyuを作成する

Greenの時と同じようにBlueというオブジェクトとBallというオブジェクトを作成してみましょう。


Sample6.lzh

Blue.tonyu
extends Enemy;

mark=100;
life=5;
sx=x;
sy=y;
ang=270;
i=-1;
while (y<$screenHeight+15) {
  ii=0;
  i=-i;
  ang+=2;
  x=sx+100*cos(ang);
  y=sy+20+20*sin(ang);
  if(rnd(200)==0) {
    while(ii<=4){
      appear(new Ball(x,y,$pat_Sample+25));
      wait(5);
      ii++;
    }
  p+=i;
  atariHantei();
  update();
}

 
Ball.tonyu
extends Enemy;

mark=0;
life=1;
while (y<$screenHeight+15) {
  y=y+2;
  atariHantei();
  update();
}

楕円形を描くBlueと下に落ちるBallを作成しました。Ballは連続して5つ出てくるようになっています。

しかし、これでは物足りません。Ballがいつも下に落ちてばかりでは芸がありません。
たまには斜め下に落ちてもらいたいものです。しかし、問題があります。

Ball1.tonyu Ball2.tonyu Ball3.tonyu
extends Enemy;

mark=0;
life=1;
rx=1;
r=1;
while (y<$screenHeight+15) {
  y=y+2;
  x=(x+rx)*r;
  if(x<15 || x>$screenHeight-15) r=-r;
  atariHantei();
  update();
}
extends Enemy;

mark=0;
life=1;
while (y<$screenHeight+15) {
  y=y+2;
  atariHantei();
  update();
}
extends Enemy;

mark=0;
life=1;
rx=-1;
r=1;
while (y<$screenHeight+15) {
  y=y+2;
  x=(x+rx)*r;
  if(x<15 || x>$screenHeight-15) r=-r;
  atariHantei();
  update();
}

Blue.tonyu
extends Enemy;

mark=100;
life=5;
sx=x;
sy=y;
ang=270;
i=-1;
while (y<$screenHeight+15) {
  ii=0;
  i=-i;
  ang+=2;
  x=sx+100*cos(ang);
  y=sy+20+20*sin(ang);
  if(rnd(200)==0) {
    while(ii<=4){
      if(x%3==0) appear(new Ball1(x,y,$pat_Sample+25));
      else if(x%3==1) appear(new Ball2(x,y,$pat_Sample+25));
      else appear(new Ball3(x,y,$pat_Sample+25));
      wait(5);
      ii++;
    }
  }
  p+=i;
  atariHantei();
  update();
}

それは、Ballをそれぞれの方向に3つ(左下・下・右下)と用意してあげなければならないことです。
しかし、Ball1,Ball2,Ball3はほとんど同じソースです。クラスも増えて見難くなること必定です。

appear関数の方で

appear(new Ball(x,y,$pat_Sample+25,vx));

のように引数を渡せないものでしょうか。実は、コンストラクタという知識を利用すればそれが可能になります。
しかし、今回はクラスが3つだけなので、コンストラクタを使用しないで、BallクラスとBlueのみで作成してみたいと思います。

まず、Blueを以前の通りに戻してみましょう。

Blue.tonyu
extends Enemy;

mark=100;
life=5;
sx=x;
sy=y;
ang=270;
i=-1;
while (y<$screenHeight+15) {
  i=-i;
  ang+=2;
  x=sx+100*cos(ang);
  y=sy+20+20*sin(ang);
  if(randomize(200)==0) {
    while(i<=4){
      appear(new Ball(x,y,$pat_Sample+25));
      wait(5);
      i++;
    }
  p+=i;
  atariHantei();
  update();
}

Ballの方には少し細工を施しておきましょう。

Ball.tonyu
extends Enemy;

mark=0;
life=1;
dx=x;
d=1;
while (y<$screenHeight+15) {
  y+=2;
  x+=(dx%3-1)*d;
  if(x<15 || x>$screenWidth-15) d=-d;
  atariHantei();
  update();
}

Ballの最初のxの数値をdxに記録しておけば、それは既にランダムな数字と同じ事です。
また、
x+=dx%3-1;
とは面白い数値の出し方です。
dx%3の考えられる数値は0,1,2の3パターンしかありません。
dx%3-1としてしまえば、考えられるパターンは-1,0,1の3種類となり、
x+=dx%3-1は

x=x+(-1)
x=x+0
x=x+1

の三種類しかなくなり、結果的に3方向に分けることに成功したわけです。

UFOのソースを変えてGreenとBlueのオブジェクトを削除しておきましょう。

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));
   if (rnd( 800 )==0 && $score>300) appear(new Green(x,y+20,$pat_Sample+19));
   if (rnd( 1600 )==0 && $score>400) appear(new Blue(x,y+20,$pat_Sample+22));
}
while(1) {
 while(x<$screenWidth - 40) {
   x=x+2;
   appearEnemy();
   update();
 }
 while(x>40) {
   x=x-2;
   appearEnemy();
   update();
 }
}

数学の知識でコンストラクタを使うことなく、プログラムも綺麗にまとまりました。次は、音楽を加えて見ましょう。

  トップ