【ウディタ】最短経路探索&接近コモン作成
障害物を避けながらマップEvがプレイヤーを追跡できる、高度な経路探索コモンを作成しました。
前回作成したコモンの副産物です。
マップイベント【移動ルート】のプレイヤー接近や、イベントコマンド【動作指定】の接近に比べ、障害物を避けて確実に目的地まで移動可能。
使用するDBもたった一つで、意外と軽い処理で実現できました。
計算を画面内に収まる範囲に限定する事で処理量を抑えてます。
さすがに2つ以上のマップイベントに使用すると若干処理が重くなるので、ウディタのバージョン3にアップデートした時にどうなるか?って感じ。
まだ動作環境はバージョン2なので。
特に使う予定は無いんですが、一応紹介。
構成
コモンEv[最短経路移動]
並列実行で呼び出す。
イベントコード
WoditorEvCOMMAND_START [111][4,0]<0>(1,1600000,-1,2)() [401][1,0]<0>(1)() [124][4,0]<1>(1600000,4096,-1,10)() [0][0,0]<1>()() [499][0,0]<0>()() [103][0,1]<0>()(" ") [103][0,1]<0>()("計算量軽減のため、マップEvが画面内にいる時のみに処理するものとする") [124][4,0]<0>(1600011,4096,1600000,11)() [111][4,0]<0>(1,1600011,0,2)() [401][1,0]<0>(1)() [172][0,0]<1>()() [0][0,0]<1>()() [499][0,0]<0>()() [103][0,1]<0>()(" ") [103][0,1]<0>()("主人公が移動したならマップ再演算") [121][4,0]<0>(1600016,1,0,0)() [124][4,0]<0>(1600012,4096,-2,0)() [124][4,0]<0>(1600013,4096,-2,1)() [111][7,0]<0>(18,1600012,1600014,5,1600013,1600015,5)() [401][1,0]<0>(1)() [0][0,0]<1>()() [401][1,0]<0>(2)() [0][0,0]<1>()() [420][1,0]<0>(0)() [121][4,0]<1>(1600016,0,0,0)() [0][0,0]<1>()() [499][0,0]<0>()() [111][4,0]<0>(1,1600016,1,2)() [401][1,0]<0>(1)() [300][2,1]<1>(0,0)("移動範囲計算") [121][4,0]<1>(1600014,1600012,0,0)() [121][4,0]<1>(1600015,1600013,0,0)() [0][0,0]<1>()() [499][0,0]<0>()() [103][0,1]<0>()(" ") [103][0,1]<0>()("移動処理") [300][4,1]<0>(0,16777217,1600000,1600010)("最短経路探索") [103][0,1]<0>()("注意:進行方向に透明状態のイベントがあると移動不可") [111][10,0]<0>(19,1600010,2,2,1600010,4,2,1600010,6,2)() [401][1,0]<0>(1)() [103][0,1]<1>()("■動作指定:[ウェイト] キャラ[CSelf0[マップEv]] / 下") [103][1,1]<1>()("【動作指定】※動作指定はクリップボードにセットできません") [0][0,0]<1>()() [401][1,0]<0>(2)() [103][0,1]<1>()("■動作指定:[ウェイト] キャラ[CSelf0[マップEv]] / 左") [103][1,1]<1>()("【動作指定】※動作指定はクリップボードにセットできません") [0][0,0]<1>()() [401][1,0]<0>(3)() [103][0,1]<1>()("■動作指定:[ウェイト] キャラ[CSelf0[マップEv]] / 右") [103][1,1]<1>()("【動作指定】※動作指定はクリップボードにセットできません") [0][0,0]<1>()() [420][1,0]<0>(0)() [111][4,0]<1>(1,1600010,8,2)() [401][1,0]<1>(1)() [103][0,1]<2>()("■動作指定:[ウェイト] キャラ[CSelf0[マップEv]] / 上") [103][1,1]<2>()("【動作指定】※動作指定はクリップボードにセットできません") [0][0,0]<2>()() [499][0,0]<1>()() [0][0,0]<1>()() [499][0,0]<0>()() WoditorEvCOMMAND_END
コモンEv[移動範囲計算]
確認用に各マスの数値を表示させるとこんな感じ↓
イベントコード
WoditorEvCOMMAND_START [103][0,1]<0>()("設定") [103][0,1]<0>()("【使用CDBを指定】 (データ数:任意,項目数:全て変数 、初期値は-1で100個)") [250][5,4]<0>(28,-3,-3,69632,1600023)("","移動範囲","","") [103][0,1]<0>()(" ") [103][0,1]<0>()("デバッグ用設定(確認モード:1でON,ピクチャ始点:各マスの数値を表示する際のピクチャ番号を指定)") [121][4,0]<0>(1600024,0,0,0)() [121][4,0]<0>(1600040,0,0,0)() [103][0,1]<0>()(" ") [99][1,0]<0>(0)() [121][4,0]<0>(1600041,1600040,1,4096)() [103][0,1]<0>()(" ") [103][0,1]<0>()("-1で初期化") [250][5,4]<0>(1600023,-2,0,0,0)("","","","") [103][0,1]<0>()(" ") [103][0,1]<0>()("計算量軽減のため、画面に収まるマスのみとする") [103][0,1]<0>()("画面内の最大最小座標を取得") [121][4,0]<0>(1600010,9000104,0,0)() [121][4,0]<0>(1600011,9000105,0,0)() [121][4,0]<0>(1600012,9000116,1600010,0)() [121][4,0]<0>(1600013,9000117,1600011,0)() [121][5,0]<0>(1600010,9000118,0,66560,3)() [103][0,1]<0>()(" ") [124][4,0]<0>(1600015,4096,-2,0)() [124][4,0]<0>(1600016,4096,-2,1)() [103][0,1]<0>()(" ") [250][5,4]<0>(1600023,1600016,1600015,0,0)("","","","") [122][2,1]<0>(1600005,0)("\cself[15]<\n>\cself[16]<\n>") [103][0,1]<0>()(" ") [170][0,0]<0>()() [103][0,1]<1>()("空なら処理終わり") [112][2,4]<1>(1,1600005)("","","","") [401][1,0]<1>(1)() [171][0,0]<2>()() [0][0,0]<2>()() [499][0,0]<1>()() [103][0,1]<1>()(" ") [103][0,1]<1>()("文字列から処理する地点を起こす+切削") [121][4,0]<1>(1600015,1600005,0,0)() [122][3,0]<1>(1600006,769,1600005)() [121][4,0]<1>(1600016,1600005,0,0)() [122][3,0]<1>(1600006,769,1600005)() [103][0,1]<1>()(" ") [103][0,1]<1>()("その地点を基点に4方向探索") [250][5,4]<1>(1600023,1600016,1600015,4096,1600014)("","","","") [103][0,1]<1>()(" ") [103][0,1]<1>()("4方向探索") [121][4,0]<1>(1600017,0,0,0)() [170][0,0]<1>()() [121][4,0]<2>(1600017,2,0,256)() [111][4,0]<2>(1,1600017,8,0)() [401][1,0]<2>(1)() [171][0,0]<3>()() [0][0,0]<3>()() [499][0,0]<2>()() [103][0,1]<2>()(" ") [103][0,1]<2>()("方向から周囲探索座標取得") [121][4,0]<2>(1600062,1600017,1,4096)() [121][4,0]<2>(1600063,1600062,3,16384)() [121][4,0]<2>(1600063,1,0,512)() [121][4,0]<2>(1600064,1600062,-3,12288)() [121][4,0]<2>(1600064,1,0,256)() [121][4,0]<2>(1600018,1600015,1600063,0)() [121][4,0]<2>(1600019,1600016,1600064,0)() [103][0,1]<2>()(" ") [103][0,1]<2>()("有効範囲判定") [111][7,0]<2>(2,1600018,1600010,4,1600018,1600012,1)() [401][1,0]<2>(1)() [176][0,0]<3>()() [0][0,0]<3>()() [401][1,0]<2>(2)() [176][0,0]<3>()() [0][0,0]<3>()() [499][0,0]<2>()() [111][7,0]<2>(2,1600019,1600011,4,1600019,1600013,1)() [401][1,0]<2>(1)() [176][0,0]<3>()() [0][0,0]<3>()() [401][1,0]<2>(2)() [176][0,0]<3>()() [0][0,0]<3>()() [499][0,0]<2>()() [103][0,1]<2>()(" ") [124][4,0]<2>(1600032,204800,1600018,1600019)() [111][4,0]<2>(1,1600032,1,2)() [401][1,0]<2>(1)() [176][0,0]<3>()() [0][0,0]<3>()() [499][0,0]<2>()() [124][4,0]<2>(1600033,73728,1600018,1600019)() [111][4,0]<2>(1,1600033,0,1)() [401][1,0]<2>(1)() [176][0,0]<3>()() [0][0,0]<3>()() [499][0,0]<2>()() [103][0,1]<2>()(" ") [121][4,0]<2>(1600020,1600014,1,0)() [103][0,1]<2>()(" ") [250][5,4]<2>(1600023,1600019,1600018,4096,1600022)("","","","") [111][7,0]<2>(18,1600020,1600022,4,1600022,-1,2)() [401][1,0]<2>(1)() [103][0,1]<3>()("より小さい数値を記録") [0][0,0]<3>()() [401][1,0]<2>(2)() [103][0,1]<3>()("記録が初期値") [0][0,0]<3>()() [420][1,0]<2>(0)() [176][0,0]<3>()() [0][0,0]<3>()() [499][0,0]<2>()() [103][0,1]<2>()(" ") [103][0,1]<2>()("数値を記録") [250][5,4]<2>(1600023,1600019,1600018,0,1600020)("","","","") [103][0,1]<2>()(" ") [103][0,1]<2>()("周囲探索座標をリストに登録") [122][2,1]<2>(1600005,256)("\cself[18]<\n>\cself[19]<\n>") [103][0,1]<2>()(" ") [111][4,0]<2>(1,1600024,1,2)() [401][1,0]<2>(1)() [121][4,0]<3>(1600041,1,0,256)() [121][4,0]<3>(1600042,1600018,9000118,8192)() [121][4,0]<3>(1600043,1600019,9000118,8192)() [121][4,0]<3>(1600042,9000104,0,512)() [121][4,0]<3>(1600043,9000105,0,512)() [121][5,0]<3>(1600042,9000118,2,78080,1)() [150][11,1]<3>(4128,1600041,0,1,1,1,255,1600042,1600043,100,0)("\E\f[8]\cself[20]") [0][0,0]<3>()() [499][0,0]<2>()() [103][0,1]<2>()(" ") [0][0,0]<2>()() [498][0,0]<1>()() [0][0,0]<1>()() [498][0,0]<0>()() [111][4,0]<0>(1,1600024,1,2)() [401][1,0]<0>(1)() [123][2,0]<1>(1600025,241)() [121][4,0]<1>(1600041,1600040,0,1536)() [150][6,0]<1>(16777218,1600040,0,0,0,1600041)() [0][0,0]<1>()() [499][0,0]<0>()() WoditorEvCOMMAND_END
コモンEv[最短経路探索]
イベントコード
WoditorEvCOMMAND_START [103][0,1]<0>()("設定") [103][0,1]<0>()("【使用CDBを指定】 (データ数:任意,項目数:全て変数 、初期値は-1で100個)") [250][5,4]<0>(28,-3,-3,69632,1600010)("","移動範囲","","") [103][0,1]<0>()(" ") [124][4,0]<0>(1600011,4096,1600000,0)() [124][4,0]<0>(1600012,4096,1600000,1)() [103][0,1]<0>()(" ") [121][4,0]<0>(1600030,9000104,0,0)() [121][4,0]<0>(1600031,9000105,0,0)() [121][4,0]<0>(1600032,9000116,1600030,0)() [121][4,0]<0>(1600033,9000117,1600031,0)() [121][5,0]<0>(1600030,9000118,0,66560,3)() [103][0,1]<0>()(" ") [121][4,0]<0>(1600016,10000,0,0)() [121][4,0]<0>(1600018,0,0,0)() [121][4,0]<0>(1600013,0,0,0)() [170][0,0]<0>()() [121][4,0]<1>(1600013,2,0,256)() [111][4,0]<1>(1,1600013,8,0)() [401][1,0]<1>(1)() [171][0,0]<2>()() [0][0,0]<2>()() [499][0,0]<1>()() [103][0,1]<1>()(" ") [103][0,1]<1>()("方向から周囲座標取得") [121][4,0]<1>(1600019,1600013,1,4096)() [121][4,0]<1>(1600020,1600019,3,16384)() [121][4,0]<1>(1600020,1,0,512)() [121][4,0]<1>(1600014,1600011,1600020,0)() [121][4,0]<1>(1600021,1600019,-3,12288)() [121][4,0]<1>(1600021,1,0,256)() [121][4,0]<1>(1600015,1600012,1600021,0)() [103][0,1]<1>()(" ") [111][7,0]<1>(2,1600014,1600030,4,1600014,1600032,1)() [401][1,0]<1>(1)() [176][0,0]<2>()() [0][0,0]<2>()() [401][1,0]<1>(2)() [176][0,0]<2>()() [0][0,0]<2>()() [499][0,0]<1>()() [111][7,0]<1>(2,1600015,1600031,4,1600015,1600033,1)() [401][1,0]<1>(1)() [176][0,0]<2>()() [0][0,0]<2>()() [401][1,0]<1>(2)() [176][0,0]<2>()() [0][0,0]<2>()() [499][0,0]<1>()() [250][5,4]<1>(1600010,1600015,1600014,4096,1600017)("","","","") [103][0,1]<1>()("CDBは-1で初期化されている") [111][4,0]<1>(1,1600017,0,1)() [401][1,0]<1>(1)() [111][4,0]<2>(1,1600017,1600016,4)() [401][1,0]<2>(1)() [121][4,0]<3>(1600016,1600017,0,0)() [121][4,0]<3>(1600018,1600013,0,0)() [0][0,0]<3>()() [499][0,0]<2>()() [0][0,0]<2>()() [499][0,0]<1>()() [0][0,0]<1>()() [498][0,0]<0>()() WoditorEvCOMMAND_END
可変DB
項目数が(とりあえず)100で、初期値が全て-1の可変DBを用意して、タイプ番号をコモンEv[移動範囲計算]のCSelf23とコモンEv[最短経路探索]のCSelf10それぞれに設定しておく。