トップ


中ボスをつける

ゲームを作成する上で、エンドレスではUserが飽きてしまう事が考えられます。
Userに自分の作成したゲームを「やってもらう」という気持ちが大切だと思います。

そこで中ボスをつけてゲームにアクセントをつけてみましょう。

一つのクラスに2つの画像を表示させる

色違いの敵ばかり出してきましたので、中ボスも似たような形で出して関連性をもたせたいものです。

このようなものをイメージしてみました。
WakuとmiddleBossというクラスを2つ作れば解決できそうですが、無駄が多そうです。
一つのクラスに2つの画像を表示させて見ましょう。


Sample7.lzh

middleBoss.tonyu
extends Enemy;

while(1){
  drawSprite(x,y,$pat_Sample+2);
  update();
}

drawSprite()という関数を使用して、middleBossクラスにskyBlueを表示させてみました。

これでは、動きがありませんので、動きを加えてみましょう。

middleBoss.tonyu
extends Enemy;

vx=2;
ang=0;
while(1){
  ang++;
  x+=vx;
  y=y+sin(3*ang)/2;
  if(x<50 || x>$screenWidth-50) vx=-vx;
  drawSprite(x,y,$pat_Sample+2);
  update();
}

これでも何か不自然です。
ボスが唐突に出現したのではボスの安売りのようです。
悠々と出てくるようにしてみましょう。

middleBoss.tonyu
extends Enemy;

x=$screenWidth/2-50;
y=-40;
while(y<80){
  x=$screenWidth/2-20;
  y++;
  drawSprite(x,y,$pat_Sample+2);
  update();
}
vx=2;
ang=0;
while(1){
  ang++;
  x+=vx;
  y=y+sin(3*ang)/2;
  if(x<80 || x>$screenWidth-80) vx=-vx;
  drawSprite(x,y,$pat_Sample+2);
  update();
}

これで、ボスは画面中央から悠々と下降し、yが80に達したときに左右にゆらゆらと揺れながら移動します。

コンストラクタ

次に、ボスというからには、何か特別なことをさせたいものです。

このように、middleBossの周りにRoundというクラスを持つ黄色い玉のオブジェクトを8つ出現させてmiddleBossの周りを回転させてみたいと思います。

xとyを与えてあげれば、出現させることは出来そうですが、middleBossからの角度を現す変数(ang)のようなものが無ければだめそうです。
一挙に出現させるつもりがなければ、Roundオブジェクトの角度が45度になったのを見計らって残りの7個を出現させれば不可能ではないのですが、ボスというからには一挙に出現させてあげたいものです。

Blueの時と同じようにRoundクラスの方で最初にxとyを調べてあげて、角度(ang)を振り分ける方法も考えられますが、8個も出現しますので、8回もif文を書かなくてはなりません。苦労が多い割には、報われない作業といわざるを得ません。
ましてや、Rond1,Round2・・・のように8個のクラスを作成してそれぞれ出現させる方法は、今回に限ってはとんでもないことです。クラスが山のように増えてしまいます。

そこで、コンストラクタを使用してみたいと思います。

まず、コンストラクタとはなんでしょうか?
コンストラクタとは、「最初に読み込んでくれるメソッド」のような役割を果たしています。
これを効率良く使用することでプログラムは見やすく快適に動作するようにもなります。

例えば、BombとReflectionを見てみましょう。

Bomb.tonyu Reflection.tonyu
extends SpriteChar;

i=1;
while(i<=3){
  wait(5);
  p=p+1;
  i++;
}
wait(5);
extends SpriteChar;

i=1;
while(i<=4){
  wait(5);
  p=p+1;
  i++;
}
wait(5);

Bombは見やすいように変更してあります。しかし、行っている動作は以前と同じです。

どうやら、BombとReflectionの違いは
だけのようです。

つまり、

appear(new Bomb(x,y,p,repeat))

のように現すことができれば、Reflectionというクラスを作成する必要は無かったことになります。

Bomb.tonyu
extends SpriteChar;

constructor round(x,y,p,repeat) {                //コンストラクター
  super(x,y,p);
  this.repeat=repeat;
}
i=1;
while(i<=repeat){
  wait(5);
  p=p+1;
  i++;
}
wait(5);
Enemy.tonyu
extends SpriteChar;

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

function atariHantei() {
  for (t in $chars) {
   if ( t is Item && crashTo(t) )  {
     if(t.p==22) if(a.get(0)>=11) a.set(0,a.get(0)-1);  //赤い玉
     if(t.p==17) if(a.get(1)<=3) a.set(1,a.get(1)+1);   //青い玉
     t.die();
   }
  }
}
a=new Array();
a.add(20);  //弾の連射間隔カウント...a(0)
a.add(1);   //弾の同時発射数...a(1)
while(1) {
  i++;
  if (getkey(39)>0 && x<$screenWidth-20 ) x=x+3;
  if (getkey(37)>0 && x>20) x=x-3;
  if (getkey(32)>1 && i>a.get(0)) {
    $mplayer.play($se_shoot,0,80);
    for(ii=1;ii<=a.get(1);ii++) appear(new Tama((x-5*(a.get(1)-1-2*(ii-1))),y,$pat_Sample+1));
    i=0;
  }
  atariHantei();
  update();
}
Tama.tonyu
extends SpriteChar;
function onDie() {
  appear(new Bomb(x , y ,$pat_Sample+14,4));  //弾が消えるアニメーション
}
while(y>0) {
 y=y-8;
 update();
}

これでReflectionクラスはいらなくなりました。クラスの削除で削除してみてください。
削除しただけではありません。Reflectionと同じ効果が得られていることを確認してみてください。
また、注釈も付け加えてみました。
後で、他のUserがこのソースを見たときに、手助けとなるはずです。
自分のプログラムを相手に見てもらうというお願いの気持ちは非常に大切です。

コンストラクタができるようになったことで、プログラムはより見やすく、効率的に動かすことが可能になりました。

次はいよいよmiddleBossの周りの黄色い玉を作成してみましょう。

  トップ