このWikiは古くなりました:新しいWikiへ移動


//@pnavi
[[←前>敵を破壊する]]  [[次→>得点を表示する]]  [[トップ>シューティングゲームの作成]]

**敵の動きに変化をつける [#b43a98ef]
***新しい動きを追加する [#q102339c]

今の敵は、上から下に直線で飛んでくるだけなので、ちょっと変わった動きをつけましょう

途中までは今までどおり下に飛んできて、その後自機のいる方向に曲がって飛んでくるようにします。敵をダブルクリックして、次のようにかきかえましょう。

//prog


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


変更した部分を順番に見ていきましょう

//progfrac 
  nexty=rnd(50)+100;


まず [[rnd>Object.rnd]](50)は、[[敵を出現させる]]でも登場した、乱数を返すメソッドです。この場合、0から49の整数の乱数が返されます。それに100が加算されるので結果として、nextyには100から149の乱数が代入されます。
次のwhileの条件が変わっています

//progfrac 
  while (y< nexty ) {


yがnextyより小さい(nextyより上)にいるまでは、先ほどまでと同じ処理をするようになります。つまり、上のほうにいるときはまっすぐ降りてきます。

そして、動きが変化するところでは、次のような処理を行います

//progfrac 
  if (x<$myChar.x) vx=2; else vx=-2; 


vxは、後で説明するように、移動方向のx成分です。

''x<$myChar.x''ならば(つまり、敵の位置が自機より左なら)右に移動するために、 vx=2のように移動方向を正の値(右方向)にします。 

その後ろについている elseは「そうでなかったら」という意味です。すなわち,
x<$myChar.x''でない''ならば(つまり、敵の位置が自機より右なら)左に移動するために、 vx=-2のように移動方向を負の値(左方向)にします。

上のようにしてvxを設定し、次の処理で実際に移動を行います。

//progfrac 
 while (y<$screenHeight) {
   y=y+3;
   x=x+vx;
   update();
 }


***追加した部分でも当たり判定を行う [#h5d92fbd]

しかし、これで実行させるとわかりますが、敵が曲がった後、当たり判定(自機が破壊される、弾にあたるとやられる)がまったくなくなってしまいます。
曲がった後のwhileの中で当たり判定の処理を書き忘れているためです。 そこで、最初のwhileで書いてある当たり判定の処理をコピーして持ってきましょう。

//prog


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


[[メソッド]]を使うともっと整理できます。当たり判定を行うatariHanteiメソッドを作成してみましょう。

//prog


 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();
     }
   }
   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) {
   y=y+3;
   x=x+vx;
   atariHantei();
   update();
 }


//@pnavi
[[←前>敵を破壊する]]  [[次→>得点を表示する]]  [[トップ>シューティングゲームの作成]]

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS