用途別リファレンス

迷路内を移動する敵

上から見下ろし視点のゲームにおいて,迷路(狭い通路)をスムーズに通行させることができます.

Main

//マップチップ1個の大きさを32x32ピクセルとする
$map=new Map{chipWidth:32,chipHeight:32};
$map.load("map.json");

//敵の初期位置を通路の真ん中になるようにする
//(xおよびyを32で割った余りが16の場所)
// dirは、その敵が最初に進む方向(角度)
//   0→   90↓  180←   270↑
new Enemy{x:32*3+16, y:32*1+16, dir:0};

Enemy


while(true) {
    //移動方向により処理を振り分ける
    if (dir==0) {// →  に移動
        // 8フレームかけて32ピクセル(マップチップ1個分)移動
        for (i=0;i<8;i++) {
            x+=4;
            update();
        }
        //進行方向の変更
        if ($map.getOnAt(x,y+32)<0) {
            //↓に壁がないならそちらに方向転換
            dir=90;   
        } else if ($map.getOnAt(x,y-32)<0) {
            //↑に壁がないならそちらに方向転換
            dir=270;
        } else if ($map.getOnAt(x+32,y)>=0) {
            //→に壁がある(直進できない)なら引き返す
            dir=180;
        }
    } else if (dir==90) {//↓に移動
        // 8フレームかけて32ピクセル(マップチップ1個分)移動
        for (i=0;i<8;i++) {
            y+=4;
            update();
        }
        //進行方向の変更
        if ($map.getOnAt(x+32,y)<0) {
            //→に壁がないならそちらに方向転換
            dir=0;   
        } else if ($map.getOnAt(x-32,y)<0) {
            //←に壁がないならそちらに方向転換
            dir=180;
        } else if ($map.getOnAt(x,y+32)>=0) {
            //↓に壁がある(直進できない)なら引き返す
            dir=270;
        }
    } else if (dir==180) {//←に移動
        // 8フレームかけて32ピクセル(マップチップ1個分)移動
        for (i=0;i<8;i++) {
            x-=4;
            update();
        }
        //進行方向の変更
        if ($map.getOnAt(x,y+32)<0) {
            //↓に壁がないならそちらに方向転換
            dir=90;   
        } else if ($map.getOnAt(x,y-32)<0) {
            //↑に壁がないならそちらに方向転換
            dir=270;
        } else if ($map.getOnAt(x-32,y)>=0) {
            //←に壁がある(直進できない)なら引き返す
            dir=0;
        }
    } else if (dir==270) {//↑に移動
        // 8フレームかけて32ピクセル(マップチップ1個分)移動
        for (i=0;i<8;i++) {
            y-=4;
            update();
        }
        //進行方向の変更
        if ($map.getOnAt(x+32,y)<0) {
            //→に壁がないならそちらに方向転換
            dir=0;   
        } else if ($map.getOnAt(x-32,y)<0) {
            //←に壁がないならそちらに方向転換
            dir=180;
        } else if ($map.getOnAt(x,y-32)>=0) {
            //↑に壁がある(直進できない)なら引き返す
            dir=90;
        }
    }    
}

バリエーション

方向転換をランダムに行なう

Enemy

    if (dir==0) {
        //進行方向の変更を行なうとき、乱数を用いると方向転換をする・しないが確率で変化する
        if ($map.getOnAt(x,y+32)<0 && rnd(100)<50) {//★
            //↓に壁がないならそちらに方向転換
            dir=90;   
        } else if ($map.getOnAt(x,y-32)<0) {
            //↑に壁がないならそちらに方向転換
            dir=270;
        } else if ($map.getOnAt(x+32,y)>=0) {
            //→に壁がある(直進できない)なら引き返す
            dir=180;
        }
    } ... 以下同様に変更

プレイヤーのいる方向に方向転換する

予めプレイヤーを作成し、変数$playerに入れておく必要があります。
Enemy

    if (dir==0) {
        //進行方向の変更を行なうとき、プレイヤーのいる方向なら方向転換をする
        if ($map.getOnAt(x,y+32)<0 && $player.y>y) {//★
            //↓に壁がなく、↓にプレイヤーがいるならそちらに方向転換
            dir=90;   
        } else if ($map.getOnAt(x,y-32)<0 && $player.y<y) {//★
            //↑に壁がなく、↑にプレイヤーがいるならそちらに方向転換
            dir=270;
        } else if ($map.getOnAt(x+32,y)>=0) {
            //→に壁がある(直進できない)なら引き返す
            dir=180;
        }
    } ... 以下同様に変更

.