キノコが何か作るブログ

ゲーム・ドット絵・アプリなどを作ります

MENU

phina.jsでrot.jsの経路探索を使ってみよう

はじめに

コード全体はこちらにあります。マップのseed値は固定です。
runstant.com
ぶっちゃけ記事にするほどのことじゃないかなーと思ったのですが、公式マニュアルがあまり馴染みのない書き方だったので記事にしました。

rot.jsのPathFinderの使い方

rot.jsでは、ダイクストラ法とA*法の2つを使って経路探索をすることが出来ます。
なので公式のマニュアルを参考に、phina.jsでrot.jsのダイクストラ法を使い経路探索させてみました。
rot.js interactive manual

準備:マップを作る

今回は2次元配列mapArrayにマップデータを保存し、経路探索に用いています。
この辺は経路探索とは直接関係ないので、飛ばしてもらって構いません。一応書いておくだけです。
rot.jsでマップデータを生成し、二次元配列で返してくれるphina.jsの関数を作ります。

  makeMap: function(){
    var cols = 17;//横ブロック数
    var rows = 17;//縦ブロック数
    //シード値固定
    ROT.RNG.setSeed(1234);
    //マップ配列
    mapArray = new Array(cols);
    for (var i = 0; i < cols; i++) {
        mapArray[i] = new Array(rows);
    }
    //rot.jsでマップデータを生成
    var map = new ROT.Map.Digger(
        cols,
        rows,
        {
            roomWidth: [2, 3],
            roomHeight: [2, 3],
        }
    );
    //マップ配列に情報を書き込む
    map.create(function (x, y, type) {
        mapArray[x][y] = type;
    });
    //マップデータを返す
    return mapArray;
  },

経路探索を行う

rot.jsで経路探索を行うときは、どこが通れるのかを探索器が確かめるためのコールバック関数を登録する必要があります。
rot.jsで生成されたマップデータは、通れる場所には「0」が代入されています。なので、探索器が「この座標通れる?」と聞いてきたときに「0」であれば「true」を返す関数を作ります。
また、探索器には最初に目的地の座標を入れてあげます。

    //通行可能なブロックかをチェックする関数
    var passableCallback = function(x, y){
      return (mapArray[x][y] === 0);
    };
    //ダイクストラ法の経路探索器
    var dijkstra = new ROT.Path.Dijkstra(goalX, goalY, passableCallback, {topology:4});

topology:4とは上下右左の4方向に移動しながら探索するということです。
もし斜め移動もできるゲームであればtopology:8とすればいいでしょう。

これで経路探索器が使えるようになりました。
あとは実行するだけです。

    //経路保存用変数
    this.path = new Array(0);
    //経路探索
    dijkstra.compute(startX, startY, function(x, y){
      //経路保存
      self.path.push({x:x, y:y});
    });

startX,startYから探索が開始され、goalX,goalYまでの道順がthis.pathに保存されます。


今回はダイクストラ法を使いましたが、rot.jsにはA*法も実装されていますので興味のある方はそちらも使ってみてください。
それでは。

プライバシーポリシー