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

敵を作る

今回作る敵は次のような動きにします

  • 地上を歩く
  • 進行方向に壁(自分と同じ高さのブロック)があると引き返す
  • 進行方向に床(自分の足元にあるブロック)がなくなっても引き返す

    メニューの「オブジェクト」>「新規」選び、次のように入力します。



    リソースキットから、Enemy1.bmpを追加します。
    自機を作るを参考に、キャラクタパターンを設定します。



    まず、次の2つの動きを作成します
  • 地上を歩く
  • 進行方向に壁(自分と同じ高さのブロック)があると引き返す

    とりあえず
  • 進行方向に床(自分の足元にあるブロック)がなくなっても引き返す
    という処理はまだしなくていいように、壁と壁の間に敵を配置します。
    このような地形がない場合、マップを作るを参考に壁を置いてください



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

    extends SpriteChar;
    vx=2; // 進行方向
    while (1) {
      if ($map.getAt(x+vx,y)==$pat_Block+0) { // 進行方向のマップパターンを調べ、ブロックのパターンだったら
        updateEx(30); // 30フレーム待機
        vx=-vx; // 進行方向を反転する
      }
      x+=vx; // 進行方向へ進む
      update();
    }


    実行すると、敵が壁の間を往復します。

    updateEx(n) は、nで指定されたフレーム数だけ待機するメソッドです。

  • 向きを変える

    自機と同様、進行方向に応じて向きを変えるには、変数fを使って次のようにします

    extends SpriteChar;
    vx=2; // 進行方向
    while (1) {
      if ($map.getAt(x+vx,y)==$pat_Block+0) { // 進行方向のマップパターンを調べ、ブロックのパターンだったら
        updateEx(30); // 30フレーム待機
        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 ($map.getAt(x+vx,y)==$pat_Block+0) { // 進行方向のマップパターンを調べ、ブロックのパターンだったら
    updateEx(30); // 30フレーム待機
        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 ($map.getAt(x+vx,y)==$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 ($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();
    }

    敵を別の場所においてテストします。今度は両側が壁になっていないところに起きます。
    まず敵を選択し、右クリックして「コピー」を選びます。



    続いて、右クリックして「貼り付け」を選びます。新しい敵が複製されます
    新しい敵を次のように配置します。



    実行してみると、2匹とも敵が往復します。

    なお、引き返しの部分の判定を詳しく解説すると、次のようになります。



    次へ