トップへチュートリアルWikiトップ

敵との当たり判定を作る

  • 敵とぶつかったら、自分が死ぬ

    敵をダブルクリックして、次のように入力します。

    extends SpriteChar;
    vx=2; // 進行方向
    a=newAnimation(); // AnimationAdapterを作成
    a.loop($pat_Enemy1+0,$pat_Enemy1+1,10); // 敵の2つのパターンを往復するアニメーション
    while (1) {
     
      if (crashTo($snowMan)) $snowMan.die(); // 自機とぶつかったら自機が死ぬ
      if ($map.getAt(x+vx,y)==$pat_Block+0 || $map.getAt(x+vx,y+32)!=$pat_Block+0) {
        // 進行方向のマップパターンがブロック、または斜め下がブロックでなかったら
        a.pause(); // 待機前にアニメーションを止める
        updateEx(30); // 30フレーム待機
        a.resume(); // 待機後にアニメーション再開
        vx=-vx; // 進行方向を反転する
      }
      x+=vx; // 進行方向へ進む
      if (vx<0) f=1; else f=0; // vx が負(左向き)なら反転
      update();
    }

    新しく追加した部分について説明します:

    crashToメソッド

    このメソッドは、指定したオブジェクト(この例では$snowMan)とこのオブジェクト(敵)がぶつかっているかを判定します。ぶつかっている場合if文の中身が実行されます。

    dieメソッド

    オブジェクトを殺す(消す)ときに呼び出します。この場合$snowManを消すことになります。

    これで、敵が自機($snowMan)に触れると、自機が死ぬ処理ができました

  • 自機が敵を踏みつけたら、敵が死ぬ

    ここでは、「敵を踏みつける」という動作を次のように決めます

    1. 自機と敵が触れている
    2. 自機はその敵より少し上にいる(8ドットくらい)
    3. 自機は下方向に速度をもっている

    このうち、
    1. 自機と敵が触れている
    という判定先ほど次の部分で行いました。
    if (crashTo($snowMan)) $snowMan.die(); // 自機とぶつかったら自機が死ぬ

    そこで、1. が成り立ったときに、 2. と 3. が成り立ったら敵が死に、そうでなければ、自機が死ぬようにします。

    extends SpriteChar;
    vx=2; // 進行方向
    a=newAnimation(); // AnimationAdapterを作成
    a.loop($pat_Enemy1+0,$pat_Enemy1+1,10); // 敵の2つのパターンを往復するアニメーション
    while (1) {
      if (crashTo($snowMan)) {
          // 自機とぶつかったら
          if ( $snowMan.y < y-8 && $snowMan.vy>0 ) {
            // 自機は敵より少し上にいて、下方向に速度をもっているならば
            die(); // 敵が死ぬ
          } else {
             $snowMan.die(); // そうでなければ自機が死ぬ
          }
      }
      if ($map.getAt(x+vx,y)==$pat_Block+0 || $map.getAt(x+vx,y+32)!=$pat_Block+0) {
        // 進行方向のマップパターンがブロック、または斜め下がブロックでなかったら
        a.pause(); // 待機前にアニメーションを止める
        updateEx(30); // 30フレーム待機
        a.resume(); // 待機後にアニメーション再開
        vx=-vx; // 進行方向を反転する
      }
      x+=vx; // 進行方向へ進む
      if (vx<0) f=1; else f=0; // vx が負(左向き)なら反転
      update();
    }

    実行してみましょう。
    敵に横から当たると、自分が消えてしまいますが、
    敵を上から踏むと敵が消えます。

  • 敵踏みつけたとき、自分が跳ね上がる

    多くのジャンプアクションでは、敵を踏みつけた後自分が跳ねるようになっています。



    この処理をやってみましょう。
    敵をダブルクリックし、次のように変更します。

    extends SpriteChar;
    vx=2; // 進行方向
    a=newAnimation(); // AnimationAdapterを作成
    a.loop($pat_Enemy1+0,$pat_Enemy1+1,10); // 敵の2つのパターンを往復するアニメーション
    while (1) {
      if (crashTo($snowMan)) {
          // 自機とぶつかったら
          if ( $snowMan.y < y-8 && $snowMan.vy>0 ) {
            // 自機は敵より少し上にいて、下方向に速度をもっているならば
            die(); // 敵が死ぬ
            
      $snowMan.vy=-5; // 自機がはねあがる
      } else {
             $snowMan.die(); // そうでなければ自機が死ぬ
          }
      }
      if ($map.getAt(x+vx,y)==$pat_Block+0 || $map.getAt(x+vx,y+32)!=$pat_Block+0) {
        // 進行方向のマップパターンがブロック、または斜め下がブロックでなかったら
        a.pause(); // 待機前にアニメーションを止める
        updateEx(30); // 30フレーム待機
        a.resume(); // 待機後にアニメーション再開
        vx=-vx; // 進行方向を反転する
      }
      x+=vx; // 進行方向へ進む
      if (vx<0) f=1; else f=0; // vx が負(左向き)なら反転
      update();
    }

    敵が死んだとき、自機のvy (縦方向の速度) を負の値に設定することで、跳ね上がる処理を行うことができます。