用途別リファレンス

マップエディタでマップを描くマップチップとの当たり判定などを参考に、マップを作成します。

壁(Enemyが通過できない部分)は手前のレイヤーに配置してください。

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;
        }
    } ... 以下同様に変更

.