Tonyu System 1 - wiki


←前次→チュートリアルWikiトップ

チュートリアル - 実践編 - シューティングゲーム (4/11)

敵を出現させる

UFOを作る

この敵はすぐ下に消えてしまうので、次々と新しいオブジェクトを出現させる仕組みを作ります。

ここでは、UFOを作り、UFOから敵があらわれるという設定にします。 オブジェクトを作るを参考にUFOのオブジェクトを作成します

mkufo.png

キャラクタパターンを設定します。

mkufop.png

ダブルクリックして次のように動きを記述します。

extends SpriteChar;
while(1) {
  while(x<$screenWidth) {
    x=x+2;
    update();
  }
  while(x>0) {
    x=x-2;
    update();
  }
}

実行させると、UFOが画面を横方向に往復します。

UFOから敵が出現する

さらに、このUFOから敵が出現するようにします。

extends SpriteChar;
while(1) {
  while(x<$screenWidth) {
    x=x+2;
    if (rnd(100)==0) appear(new Enemy(x,y,$pat_Sample+2));
    update();
  }
  while(x>0) {
    x=x-2;
    update();
  }
}

追加した部分について解説します。

 if (rnd(100)==0) ..

rnd(100)は、0から99までの整数乱数を返します。その値が0のとき、つまり100分の1の確率でifの後ろが実行されます。

 .. appear(new Enemy(x,y,$pat_Sample+2));

これによって、敵クラス(Enemy)のオブジェクトが作成されます。 出現場所はUFOのいる場所、キャラクタパターンは $pat_Sample+2 です (弾を撃つ参考)

上の処理では、左から右に移動しているときしか敵が出現しません。 右から左に移動中にもこの処理を挿入する必要があります。

extends SpriteChar;
while(1) {
  while(x<$screenWidth) {
    x=x+2;
    if (rnd(100)==0) appear(new Enemy(x,y,$pat_Sample+2));
    update();
  }
   
  while(x>0) {
    x=x-2;
    if (rnd(100)==0) appear(new Enemy(x,y,$pat_Sample+2));
    update();
  }
}

メソッドを定義する

このプログラムでは敵を出現させるために、全く同じ処理を2箇所に書いたことになります。
これでもプログラムは正しく動くのですが、いくつか不便な点があります。
例えば出現確率を変えたいとか、敵のキャラクタパターンを変えたいとかいったときに、両方書き換える必要があります。

そこで、この敵出現処理をまとめることを行います。

extends SpriteChar;

function appearEnemy() {
  if (rnd(100)==0) appear(new Enemy(x,y,$pat_Sample+2));
}

while(1) {
  while(x<$screenWidth) {
    x=x+2;
    appearEnemy();
    update();
  }
  while(x>0) {
    x=x-2;
    appearEnemy();
    update();
  }
}

まず、一番上に書いた部分について解説します。

function appearEnemy() {
  if (rnd(100)==0) appear(new Enemy(x,y,$pat_Sample+2));
}

これはメソッドと呼ばれ、ある処理に名前をつけて何度も使えるようにしたものです。
ここでは、1/100の確率で敵を出現させる処理に appearEnemyという名前(メソッド名)をつけています。
この部分は、最初にいきなり実行されるわけではなく、あとからこのメソッドを呼び出すことによって実行されます。

その呼び出しを行うのが、下のほうに書いた

appearEnemy();

です。このように

書式メソッドの呼び出し

メソッド名();

と書くことで、いつでもメソッドを呼ぶことができます。

試しに、敵の出現確率を1/50に変えてみましょう。それにはappearEnemyの一箇所を書き換えればよいのです。
このようにメソッドを使って、よく使う処理をまとめておくと、後で修正が楽になります。

extends SpriteChar;
function appearEnemy() {
  if (rnd(50)==0) appear(new Enemy(x,y,$pat_Sample+2));
}
while(1) {
  while(x<$screenWidth) {
    x=x+2;
    appearEnemy();
    update();
  }
  while(x>0) {
    x=x-2;
    appearEnemy();
    update();
  }
}

←前次→チュートリアルWikiトップ