RPGツクール2000/システム
最短ルート移動
■1マスずつ検索
(更新:2015/12/19)


出発地点と到着地点からそれぞれ1マスずつ検索して最短ルートを見つけ出すイベントの設定例です。



なお、最短ルート移動にはいくつかの設定方法があります。
詳しくは一覧のページをご覧ください。
【最短ルート移動の一覧ページを開く】



☆特徴とサンプル
この1マスずつ検索は、どんなに複雑な地形でも確実に最短ルートを見つけ出す事ができますが、
最短ルートを検索する時に処理落ちが発生するため、
常に最短ルートを検索し続けるような処理(リアルタイム検索)には使えません。

また変数を大量に使用する上、イベント処理もかなり複雑なので、
ツクールの初心者が手を出してはいけないレベルであると言えます。
ちょっとした設定ミスによって、最悪フリーズを起こす可能性がありますので、
処理構造をちゃんと理解した上でご利用ください。



動作見本用のサンプルデータ
サンプルのダウンロードは↓をクリックしてください。
サンプルのイベント設定状況を見る場合は、
ツクールの作品データが入っているフォルダを開いて、
その中にサンプルの作品データを入れてください。
【ツクールのフォルダの開き方を見る】
このサンプルデータのイベント設定をコピー&貼り付けして、
制作中の作品に使用する場合は、
イベントの処理構造を理解した上自己責任でご利用ください。

動作確認用のサンプル内では正常に動いていたイベントが、
制作中の作品にコピー&貼り付けしたら正常に動かなくなった場合は、
明らかにコピー&貼り付けの作業に問題があった事になります。
サンプルを含め、YADOT内の全ページは、
RPGツクール2000の体験版はサポート対象外になっています。



☆処理構造の説明
移動ルートの確立のため、まず初めに出発地点と到着地点から1マスずつ移動できるマスを検索します。
そして両者の合流地点を探し出します。


合流地点が見つかったら、合流地点から到着地点までのルートを確立し、
出発地点から到着地点までの最短ルートを作り上げます。


合流地点を見つける処理では、
出発地点からの移動方向、または到着地点へ向かう移動方向変数に保存します。
これにより、合流地点が見つかった時に素早く最短ルートを確立させる事ができます。




合流地点の検索時には、1マスごとに変数を割り当てておきます。
今回は変数1001番以降の変数を使います。
この変数1001番以降には
マスが検索済みかどうか」と「移動方向の情報」を一緒にしたデータを保存します。

変数1001番以降に設定する値 内容
−1 初期値です。まだ調べていないマスになります。
0以上の値は「検索済み」の扱いになります。
出発地点に設定する値です。
10 到着地点に設定する値です。
2、4、6、8 出発地点からの移動方向です。
12、14、16、18 到着地点へ向かう移動方向です。
出発地点の移動方向と区別させるために「移動方向+10」としています。
999999 通行不可(検索しない)のマスです。

移動方向は、テンキーの番号に準じます。
   【上に移動】
出発地点側:
到着地点側:18
 
 【左に移動】
出発地点側:
到着地点側:14
   【右に移動】
出発地点側:
到着地点側:16
   【下に移動】
出発地点側:
到着地点側:12
 



今回の処理では、出発地点を中心に上下左右に20マスの範囲で移動ルートを検索します。

出発地点より21マス以上離れたマスに当たる変数には、予め通行不可の値(999999)を設定しておきます。
※下の画像で言うと黒いマスの変数に予め検索処理前に「999999」を設定しておきます。
 イベント設定例で言うと「注釈:マスデータ初期化」の中で事前に999999にしています。


使用する変数番号は1001〜2805番の範囲になり、中心(出発地点)変数1903番になります。



隣のマスの変数の値を調べる場合は、以下のように呼び出す変数番号を変えます。
  減算42  
減算1   加算1
  加算42  

もしも出発地点(中心のマス)の隣のマスを調べる場合は、以下のように変数番号が変わります。
  1861  
1902 1903 1904
  1945  



到着地点の変数1001番以降の変数番号は、
出発地点(変数1903番)から上下左右に何マス離れているのかで、変数番号を割り出します。



例えば上の画像の場合、出発地点(イヌ)から到着地点(ネコ)までは、
「X+4マス、Y+2マス」の距離、離れています。
この場合は、1903(出発地点)から「右に4(+4×4マス)」と「下に2(+42×2マス)」が加算され、
到着地点の変数番号は、変数1991番になります。



合流地点までの検索では、
次に調べるマスの座標変数1001番以降の変数番号を予め指定した変数に記憶させます。

  出発地点からの検索 到着地点からの検索
次に調べるX座標 変数101〜200番 変数401〜500番
次に調べるY座標 変数201〜300番 変数501〜600番
次に調べる変数1001番以降の変数番号 変数301〜400番 変数601〜700番

▼変数の代入イメージ


変数は各項目ごとに100個用意されており、100個使い切ると初めの変数に戻ります。
変数101〜200番で例えると、200番まで進んだら101番に戻ります。



合流地点が見つかったら、出発地点から到着地点までの移動ルートを変数701〜1000番に記憶します。

移動ルートの設定は、まず両者の合流地点を繋ぐ移動方向を設定します。
下の画像の場合、両者を繋ぐ方向は「6(右に移動)」なので、変数705番に「6」を設定しています。



あとは合流地点から出発地点合流地点から到着地点の移動方向を設定すれば、
移動ルートの設定が完了します。

実際に移動では、変数701番から順に移動方向を読み取り、
移動方向が「0」になった所が到着地点になります。



☆変数・ラベル
変数とラベルの番号使用内容の一覧表です。
※スイッチは使用しません。

変数
番号 名前 使用内容
0001 出発地点:X座標 出発地点のX座標を代入
0002 出発地点:Y座標 出発地点のY座標を代入
0003 到着地点:X座標 到着地点のX座標を代入
0004 到着地点:Y座標 到着地点のY座標を代入
  
0006 到着:歩数 到着地点からの歩数
0007 出発:歩数 出発地点からの歩数
0008 出発:最短ルート変数 最短ルートの移動方向を変数701〜1000番に代入する時に使用
0009 到着:最短ルート変数 最短ルートの移動方向を変数701〜1000番に代入する時に使用
  
0011 出力:X座標 別の変数に記憶されたX座標を出力する時に使用
0012 出力:Y座標 別の変数に記憶されたY座標を出力する時に使用
0013 出力:変数番号 別の変数に記憶された変数番号を出力する時に使用
0014 出力:移動方向 別の変数に記憶された検索有無&移動方向を出力する時に使用
0015 地形ID 地形IDを呼び出す時に使用
  
0017 処理中記憶変数番号 調べるマスがまだあるかどうかを判断する時に使用
0017 合流→到着変数番号 合流地点の到着側の変数1001番以降の変数番号
  
0021 記憶/出発:次X座標 変数101〜200番への代入に使用
0022 記憶/出発:次Y座標 変数201〜300番への代入に使用
0023 記憶/出発:次変数 変数301〜400番への代入に使用
  
0026 記憶/到着:次X座標 変数401〜500番への代入に使用
0027 記憶/到着:次Y座標 変数501〜600番への代入に使用
0028 記憶/到着:次変数 変数601〜700番への代入に使用
  
0031 呼出/出発:次X座標 変数101〜200番からの出力で使用
0032 呼出/出発:次Y座標 変数201〜300番からの出力で使用
0033 呼出/出発:次変数 変数301〜400番からの出力で使用
  
0036 呼出/出発:次X座標 変数401〜500番からの出力で使用
0037 呼出/出発:次Y座標 変数501〜600番からの出力で使用
0038 呼出/出発:次変数 変数601〜700番からの出力で使用
  
0101〜0200 出発地点から見た次の歩数で調べるマスのX座標を保存
0201〜0300 出発地点から見た次の歩数で調べるマスのY座標を保存
0301〜0400 出発地点から見た次の歩数で調べるマスの変数番号(1001〜)を保存
0401〜0500 到着地点から見た次の歩数で調べるマスのX座標を保存
0501〜0600 到着地点から見た次の歩数で調べるマスのY座標を保存
0601〜0700 到着地点から見た次の歩数で調べるマスの変数番号(1001〜)を保存
0701〜1000 出発地点からの移動方向(最短ルート)を保存
1001〜2805 検索済み&移動方向を保存


ラベル
番号 使用内容
01 変数1001番以降で範囲外となるマスの初期設定に使用
  
10 合流地点の検索処理:出発地点からの検索トップへ戻る時に使用
11 合流地点の検索処理:出発地点からの1マスずつの検索時に使用
12 合流地点の検索処理:到着地点からの1マスずつの検索時に使用
  
20 合流地点が見つかるとこのラベルへ飛ばされる
合流地点から出発地点までの移動ルートを確立する時に使用
21 合流地点から到着地点までの移動ルートを確立する時に使用

【変数・ラベルの一覧表を別ウィンドウで表示する】



変数の操作の設定では、Vが付いている設定Vが付いていない設定があります。
例えば…
◆変数の操作:[0013:出力:変数番号]代入,変数[V[0033]]の値
◆変数の操作:[0018:合流→到着変数番号]代入,変数[0013]の値

と言った感じです。

オペランド3段目の設定=Vが付く
オペランド2段目の設定=Vが付かない

Vの有無を間違えると正常にイベントが動きませんので、
Vの有無をよ〜く確認してイベントを設定してください。

なお、このVの設定(変数〜の番号の変数)に関しては、
↓のページで解説しています。
【変数〜の番号の変数の解説ページを見る】



☆地形IDの準備
移動できるかどうかの判断は、地形IDを使って行います。
今回のイベント処理では、
通行可能=地形ID「2以外」
通行不可=地形ID「2」

と設定します。

まずデータベース「地形」を開き、通行可能通行不可の地形を準備してください。
既に何らかの地形設定がある場合は、通行不可の地形だけを準備してください。



データベース「チップセット」にて、
通行可能」「通行不可」それぞれの地形番号を下層チップに設定してください。
既に何らかの地形設定がある場合は、通行不可の地形だけを設定してください。



以上で地形IDの準備は完了です。



☆イベントの設定
最短ルートを検索するイベントはコモンイベントに設定します。

※似たようなイベント設定をコピー&貼り付けで設定する場合、
 貼り付け後の修正を忘れないように注意してください。
 出発地点と到着地点の設定は、似ているようで向き設定などが違うので、特に注意してください。


■コモンイベント「最短ルート検索」
イベント開始条件:呼び出されたときのみ
◆注釈:■■■■■■■■■■■■■■■■■■■■■■■■■■■■
:  :▼初期設定
:  : 

◆変数の操作:[0006〜0007]代入,0<歩数の初期化
◆変数の操作:[0008〜0009]代入,700<最短ルートを保存する変数番号−1を設定
◆変数の操作:[0701〜1000]代入,0<最短ルートを保存する変数を初期化
◆変数の操作:[0021:記憶/出発:次X座標]代入,101<変数101番を呼び出す準備
◆変数の操作:[0022:記憶/出発:次Y座標]代入,201<変数201番を呼び出す準備
◆変数の操作:[0023:記憶/出発:次変数]代入,301<変数301番を呼び出す準備
◆変数の操作:[0026:記憶/到着:次X座標]代入,401<変数401番を呼び出す準備
◆変数の操作:[0027:記憶/到着:次Y座標]代入,501<変数501番を呼び出す準備
◆変数の操作:[0028:記憶/到着:次変数]代入,601<変数601番を呼び出す準備
◆変数の操作:[0031:呼出/出発:次X座標]代入,101<変数101番を呼び出す準備
◆変数の操作:[0032:呼出/出発:次Y座標]代入,201<変数201番を呼び出す準備
◆変数の操作:[0033:呼出/出発:次変数]代入,301<変数301番を呼び出す準備
◆変数の操作:[0036:呼出/出発:次X座標]代入,401<変数401番を呼び出す準備
◆変数の操作:[0037:呼出/出発:次Y座標]代入,501<変数501番を呼び出す準備
◆変数の操作:[0038:呼出/出発:次変数]代入,601<変数601番を呼び出す準備
◆注釈:■■■■■■■■■■■■■■
:  :▼マスデータ初期化
:  : 

◆変数の操作:[1001〜2805]代入,-1<全てのマスを「未検索」に設定
◆変数の操作:[1001〜1042]代入,999999<中心から21マス以上離れたマスを「通行不可」に設定
◆変数の操作:[2789〜2805]代入,999999<中心から21マス以上離れたマスを「通行不可」に設定
◆変数の操作:[0013:出力:変数番号]代入,1084<変数1084番を呼び出す準備
◆ラベルの設定:1番
◆変数の操作:[V[0013]]代入,999999<中心から21マス以上離れたマスを「通行不可」に設定
◆条件分岐:変数[0013:出力:変数番号]が2764より小さい<まだ「通行不可」を設定する変数が残っている時
 ◆変数の操作:[0013:出力:変数番号]加算,42<1つ下の変数番号にする
 ◆指定ラベルへ飛ぶ:1番
 ◆
:分岐終了
◆注釈:■■■■■■■■■■■■■■
:  :▼出発地点と到着地点の座標の差
:  : 

◆変数の操作:[0011:出力:X座標]代入,変数[0003]の値<到着地点のX座標を代入
◆変数の操作:[0012:出力:Y座標]代入,変数[0004]の値<到着地点のY座標を代入
◆変数の操作:[0011:出力:X座標]減算,変数[0001]の値<出発地点のX座標で減算して差を出す
◆変数の操作:[0012:出力:Y座標]減算,変数[0002]の値<出発地点のY座標で減算して差を出す
◆変数の操作:[0013:出力:変数番号]代入,1903<出発地点(中心)の変数番号を設定
◆変数の操作:[0013:出力:変数番号]加算,変数[0011]の値<両者のX座標の差を加算
◆変数の操作:[0012:出力:Y座標]乗算,42<両者のY座標の差を乗算42
◆変数の操作:[0013:出力:変数番号]加算,変数[0012]の値<乗算42にした両者のY座標の差を加算
◆注釈:■■■■■■■■■■■■■■
:  :▼最初のマスのデータ設定
:  : 

◆変数の操作:[V[0021]]代入,変数[0001]の値<最初に検索する出発地点のX座標を代入
◆変数の操作:[V[0022]]代入,変数[0002]の値<最初に検索する出発地点のY座標を代入
◆変数の操作:[V[0023]]代入,1903<最初に検索する到着地点の変数番号を代入
◆変数の操作:[V[0026]]代入,変数[0003]の値<最初に検索する到着地点のX座標を代入
◆変数の操作:[V[0027]]代入,変数[0004]の値<最初に検索する到着地点のY座標を代入
◆変数の操作:[V[0028]]代入,変数[0013]の値<最初に検索する到着地点の変数番号を代入
◆変数の操作:[0021〜0023]加算,1<次の検索マスを保存する変数番号を加算1
◆変数の操作:[0026〜0028]加算,1<次の検索マスを保存する変数番号を加算1
◆変数の操作:[1903:出発地点]代入,0<出発地点のマスを「検索済み」にする
◆変数の操作:[V[0013]]代入,10<到着地点のマスを「検索済み」にする
◆注釈:■■■■■■■■■■■■■■■■■■■■■■■■■■■■
:  :▼検索処理
:  : 

◆ラベルの設定:10番<合流地点が見つからず、次の歩数になった時にここへ戻ってくる
◆注釈:■■■■■■■■■■■■■■■■■■■■■
:  :▼出発地点からの検索処理
:  : 

◆変数の操作:[0007〜0009]加算,1<次の歩数にする
◆変数の操作:[0017:処理中記憶変数番号]代入,変数[0021]の値<最後に記憶した変数番号を代入
◆ラベルの設定:11番<検索候補が無くなるまで、何度もここへ処理を戻す
◆変数の操作:[0011:出力:X座標]代入,変数[V[0031]]の値<次に検索するX座標を呼び出す
◆変数の操作:[0012:出力:Y座標]代入,変数[V[0032]]の値<次に検索するY座標を呼び出す
◆変数の操作:[0013:出力:変数番号]代入,変数[V[0033]]の値<次に検索する変数番号を呼び出す
◆注釈:■■■■■■■■■■■■■■
:  :▼出発:上のマスを検索
:  : 

◆変数の操作:[0012:出力:Y座標]減算,1<検索するマスの上のマスにセット
◆変数の操作:[0013:出力:変数番号]減算,42<検索するマスの上のマスにセット
◆変数の操作:[0014:出力:移動方向]代入,変数[V[0013]]の値<上のマスの移動方向を呼び出す
◆条件分岐:変数[0014:出力:移動方向]が-1以下(オプション:ON)<上のマスがまだ未検索の時
 ◆指定位置の地形ID取得:(V[0011],V[0012]),[0015:地形ID]
 ◆条件分岐:変数[0015:地形ID]が2(オプション:ON)<通行不可の地形の時
  ◆注釈:▼通行不可マス
  ◆変数の操作:[V[0013]]代入,999999<上のマスを通行不可にする
  ◆
 :それ以外の場合<通行可能な地形の時
  ◆注釈:▼通行可能マス
  ◆変数の操作:[V[0013]]代入,8<移動方向を設定
  ◆変数の操作:[V[0021]]代入,変数[0011]の値<次の検索候補のX座標を保存
  ◆変数の操作:[V[0022]]代入,変数[0012]の値<次の検索候補のY座標を保存
  ◆変数の操作:[V[0023]]代入,変数[0013]の値<次の検索候補の変数番号を保存
  ◆条件分岐:変数[0021:記憶/出発:次X座標]が200<次の検索候補を保存する変数番号が限界値の時
   ◆変数の操作:[0021〜0023]減算,99<最初の変数番号に戻す
   ◆
  :それ以外の場合<次の検索候補を保存する変数番号が限界値ではない時
   ◆変数の操作:[0021〜0023]加算,1<次の変数番号にする
   ◆
  :分岐終了
  ◆
 :分岐終了
 ◆
:それ以外の場合<上のマスが既に検索済みの時
 ◆条件分岐:変数[0014:出力:移動方向]が999999より小さい<上のマスが通行不可では無い時
  ◆条件分岐:変数[0014:出力:移動方向]が10以上<上のマスが到着地点からの検索済みマスの時(合流地点の発見)
   ◆変数の操作:[0013:出力:変数番号]代入,変数[V[0033]]の値<検索中のマスの変数番号を代入
   ◆変数の操作:[0018:合流→到着変数番号]代入,変数[0013]の値<合流地点の出発側の変数番号を代入
   ◆変数の操作:[0018:合流→到着変数番号]減算,42<到着側の変数番号にする
   ◆変数の操作:[V[0008]]代入,8<合流地点の両者を繋ぐ移動方向を設定
   ◆指定ラベルへ飛ぶ:20番<合流地点が見つかったので、最短ルートの作成処理へ飛ぶ
   ◆
  :分岐終了
  ◆
 :分岐終了
 ◆
:分岐終了
◆注釈:■■■■■■■■■■■■■■
:  :▼出発:下のマスを検索
:  : 

◆変数の操作:[0012:出力:Y座標]加算,2<検索するマスの上のマスから下のマスへ変更
◆変数の操作:[0013:出力:変数番号]加算,84<検索するマスの上のマスから下のマスへ変更
◆変数の操作:[0014:出力:移動方向]代入,変数[V[0013]]の値
◆条件分岐:変数[0014:出力:移動方向]が-1以下(オプション:ON)
 ◆指定位置の地形ID取得:(V[0011],V[0012]),[0015:地形ID]
 ◆条件分岐:変数[0015:地形ID]が2(オプション:ON)
  ◆注釈:▼通行不可マス
  ◆変数の操作:[V[0013]]代入,999999
  ◆
 :それ以外の場合
  ◆注釈:▼通行可能マス
  ◆変数の操作:[V[0013]]代入,2
  ◆変数の操作:[V[0021]]代入,変数[0011]の値
  ◆変数の操作:[V[0022]]代入,変数[0012]の値
  ◆変数の操作:[V[0023]]代入,変数[0013]の値
  ◆条件分岐:変数[0021:記憶/出発:次X座標]が200
   ◆変数の操作:[0021〜0023]減算,99
   ◆
  :それ以外の場合
   ◆変数の操作:[0021〜0023]加算,1
   ◆
  :分岐終了
  ◆
 :分岐終了
 ◆
:それ以外の場合
 ◆条件分岐:変数[0014:出力:移動方向]が999999より小さい
  ◆条件分岐:変数[0014:出力:移動方向]が10以上
   ◆変数の操作:[0013:出力:変数番号]代入,変数[V[0033]]の値
   ◆変数の操作:[0018:合流→到着変数番号]代入,変数[0013]の値
   ◆変数の操作:[0018:合流→到着変数番号]加算,42
   ◆変数の操作:[V[0008]]代入,2
   ◆指定ラベルへ飛ぶ:20番
   ◆
  :分岐終了
  ◆
 :分岐終了
 ◆
:分岐終了
◆注釈:■■■■■■■■■■■■■■
:  :▼出発:左のマスを検索
:  : 

◆変数の操作:[0011〜0012]減算,1<検索するマスの下のマスから左のマスへ変更
◆変数の操作:[0013:出力:変数番号]減算,43<検索するマスの下のマスから左のマスへ変更
◆変数の操作:[0014:出力:移動方向]代入,変数[V[0013]]の値
◆条件分岐:変数[0014:出力:移動方向]が-1以下(オプション:ON)
 ◆指定位置の地形ID取得:(V[0011],V[0012]),[0015:地形ID]
 ◆条件分岐:変数[0015:地形ID]が2(オプション:ON)
  ◆注釈:▼通行不可マス
  ◆変数の操作:[V[0013]]代入,999999
  ◆
 :それ以外の場合
  ◆注釈:▼通行可能マス
  ◆変数の操作:[V[0013]]代入,4
  ◆変数の操作:[V[0021]]代入,変数[0011]の値
  ◆変数の操作:[V[0022]]代入,変数[0012]の値
  ◆変数の操作:[V[0023]]代入,変数[0013]の値
  ◆条件分岐:変数[0021:記憶/出発:次X座標]が200
   ◆変数の操作:[0021〜0023]減算,99
   ◆
  :それ以外の場合
   ◆変数の操作:[0021〜0023]加算,1
   ◆
  :分岐終了
  ◆
 :分岐終了
 ◆
:それ以外の場合
 ◆条件分岐:変数[0014:出力:移動方向]が999999より小さい
  ◆条件分岐:変数[0014:出力:移動方向]が10以上
   ◆変数の操作:[0013:出力:変数番号]代入,変数[V[0033]]の値
   ◆変数の操作:[0018:合流→到着変数番号]代入,変数[0013]の値
   ◆変数の操作:[0018:合流→到着変数番号]減算,1
   ◆変数の操作:[V[0008]]代入,4
   ◆指定ラベルへ飛ぶ:20番
   ◆
  :分岐終了
  ◆
 :分岐終了
 ◆
:分岐終了
◆注釈:■■■■■■■■■■■■■■
:  :▼出発:右のマスを検索
:  : 

◆変数の操作:[0011:出力:X座標]加算,2<検索するマスの左のマスから右のマスへ変更
◆変数の操作:[0013:出力:変数番号]加算,2<検索するマスの左のマスから右のマスへ変更
◆変数の操作:[0014:出力:移動方向]代入,変数[V[0013]]の値
◆条件分岐:変数[0014:出力:移動方向]が-1以下(オプション:ON)
 ◆指定位置の地形ID取得:(V[0011],V[0012]),[0015:地形ID]
 ◆条件分岐:変数[0015:地形ID]が2(オプション:ON)
  ◆注釈:▼通行不可マス
  ◆変数の操作:[V[0013]]代入,999999
  ◆
 :それ以外の場合
  ◆注釈:▼通行可能マス
  ◆変数の操作:[V[0013]]代入,6
  ◆変数の操作:[V[0021]]代入,変数[0011]の値
  ◆変数の操作:[V[0022]]代入,変数[0012]の値
  ◆変数の操作:[V[0023]]代入,変数[0013]の値
  ◆条件分岐:変数[0021:記憶/出発:次X座標]が200
   ◆変数の操作:[0021〜0023]減算,99
   ◆
  :それ以外の場合
   ◆変数の操作:[0021〜0023]加算,1
   ◆
  :分岐終了
  ◆
 :分岐終了
 ◆
:それ以外の場合
 ◆条件分岐:変数[0014:出力:移動方向]が999999より小さい
  ◆条件分岐:変数[0014:出力:移動方向]が10以上
   ◆変数の操作:[0013:出力:変数番号]代入,変数[V[0033]]の値
   ◆変数の操作:[0018:合流→到着変数番号]代入,変数[0013]の値
   ◆変数の操作:[0018:合流→到着変数番号]加算,1
   ◆変数の操作:[V[0008]]代入,6
   ◆指定ラベルへ飛ぶ:20番
   ◆
  :分岐終了
  ◆
 :分岐終了
 ◆
:分岐終了
◆注釈:■■■■■■■■■■■■■■
:  :▼出発:まだ検索マスがあるかどうかをチェック
:  : 

◆条件分岐:変数[0031:呼出/出発:次X座標]が200(オプション:ON)<次の検索候補を呼び出す変数番号が限界値の時
 ◆変数の操作:[0031〜0033]減算,99<最初の変数番号に戻す
 ◆
:それ以外の場合<次の検索候補を呼び出す変数番号が限界値ではない時
 ◆変数の操作:[0031〜0033]加算,1<次の変数番号にする
 ◆
:分岐終了
◆条件分岐:変数[0017:処理中記憶変数番号]がV[0031]以外<まだ最後に記憶した変数番号ではない
 ◆指定ラベルへ飛ぶ:11番<次の検索候補を調べるために処理を戻す
 ◆
:分岐終了
◆注釈:■■■■■■■■■■■■■■■■■■■■■
:  :▼到着地点からの検索処理
:  : 

◆変数の操作:[0006:到着:歩数]加算,1<次の歩数にする
◆変数の操作:[0017:処理中記憶変数番号]代入,変数[0026]の値<最後に記憶した変数番号を代入
◆ラベルの設定:12番<検索候補が無くなるまで、何度もここへ処理を戻す
◆変数の操作:[0011:出力:X座標]代入,変数[V[0036]]の値<次に検索するX座標を呼び出す
◆変数の操作:[0012:出力:Y座標]代入,変数[V[0037]]の値<次に検索するY座標を呼び出す
◆変数の操作:[0013:出力:変数番号]代入,変数[V[0038]]の値<次に検索する変数番号を呼び出す
◆注釈:■■■■■■■■■■■■■■
:  :▼到着:上のマスを検索
:  : 

◆変数の操作:[0012:出力:Y座標]減算,1<検索するマスの上のマスにセット
◆変数の操作:[0013:出力:変数番号]減算,42<検索するマスの上のマスにセット
◆変数の操作:[0014:出力:移動方向]代入,変数[V[0013]]の値
◆条件分岐:変数[0014:出力:移動方向]が-1以下(オプション:ON)
 ◆指定位置の地形ID取得:(V[0011],V[0012]),[0015:地形ID]
 ◆条件分岐:変数[0015:地形ID]が2(オプション:ON)
  ◆注釈:▼通行不可マス
  ◆変数の操作:[V[0013]]代入,999999
  ◆
 :それ以外の場合
  ◆注釈:▼通行可能マス
  ◆変数の操作:[V[0013]]代入,12
  ◆変数の操作:[V[0026]]代入,変数[0011]の値
  ◆変数の操作:[V[0027]]代入,変数[0012]の値
  ◆変数の操作:[V[0028]]代入,変数[0013]の値
  ◆条件分岐:変数[0026:記憶/到着:次X座標]が500
   ◆変数の操作:[0026〜0028]減算,99
   ◆
  :それ以外の場合
   ◆変数の操作:[0026〜0028]加算,1
   ◆
  :分岐終了
  ◆
 :分岐終了
 ◆
:それ以外の場合
 ◆条件分岐:変数[0014:出力:移動方向]が10より小さい<上のマスが出発地点からの検索済みマスの時(合流地点の発見)
  ◆変数の操作:[0018:合流→到着変数番号]代入,変数[V[0038]]の値<合流地点の到着側の変数番号を代入
  ◆変数の操作:[0007〜0009]加算,1<次の歩数にする
  ◆変数の操作:[V[0008]]代入,2<合流地点の両者を繋ぐ移動方向を設定
  ◆指定ラベルへ飛ぶ:20番
  ◆
 :分岐終了
 ◆
:分岐終了
◆注釈:■■■■■■■■■■■■■■
:  :▼到着:下のマスを検索
:  : 

◆変数の操作:[0012:出力:Y座標]加算,2<検索するマスの上のマスから下のマスへ変更
◆変数の操作:[0013:出力:変数番号]加算,84<検索するマスの上のマスから下のマスへ変更
◆変数の操作:[0014:出力:移動方向]代入,変数[V[0013]]の値
◆条件分岐:変数[0014:出力:移動方向]が-1以下(オプション:ON)
 ◆指定位置の地形ID取得:(V[0011],V[0012]),[0015:地形ID]
 ◆条件分岐:変数[0015:地形ID]が2(オプション:ON)
  ◆注釈:▼通行不可マス
  ◆変数の操作:[V[0013]]代入,999999
  ◆
 :それ以外の場合
  ◆注釈:▼通行可能マス
  ◆変数の操作:[V[0013]]代入,18
  ◆変数の操作:[V[0026]]代入,変数[0011]の値
  ◆変数の操作:[V[0027]]代入,変数[0012]の値
  ◆変数の操作:[V[0028]]代入,変数[0013]の値
  ◆条件分岐:変数[0026:記憶/到着:次X座標]が500(オプション:ON)
   ◆変数の操作:[0026〜0028]減算,99
   ◆
  :それ以外の場合
   ◆変数の操作:[0026〜0028]加算,1
   ◆
  :分岐終了
  ◆
 :分岐終了
 ◆
:それ以外の場合
 ◆条件分岐:変数[0014:出力:移動方向]が10より小さい
  ◆変数の操作:[0018:合流→到着変数番号]代入,変数[V[0038]]の値
  ◆変数の操作:[0007〜0009]加算,1
  ◆変数の操作:[V[0008]]代入,8
  ◆指定ラベルへ飛ぶ:20番
  ◆
 :分岐終了
 ◆
:分岐終了
◆注釈:■■■■■■■■■■■■■■
:  :▼到着:左のマスを検索
:  : 

◆変数の操作:[0011〜0012]減算,1<検索するマスの下のマスから左のマスへ変更
◆変数の操作:[0013:出力:変数番号]減算,43<検索するマスの下のマスから左のマスへ変更
◆変数の操作:[0014:出力:移動方向]代入,変数[V[0013]]の値
◆条件分岐:変数[0014:出力:移動方向]が-1以下(オプション:ON)
 ◆指定位置の地形ID取得:(V[0011],V[0012]),[0015:地形ID]
 ◆条件分岐:変数[0015:地形ID]が2(オプション:ON)
  ◆注釈:▼通行不可マス
  ◆変数の操作:[V[0013]]代入,999999
  ◆
 :それ以外の場合
  ◆注釈:▼通行可能マス
  ◆変数の操作:[V[0013]]代入,16
  ◆変数の操作:[V[0026]]代入,変数[0011]の値
  ◆変数の操作:[V[0027]]代入,変数[0012]の値
  ◆変数の操作:[V[0028]]代入,変数[0013]の値
  ◆条件分岐:変数[0026:記憶/到着:次X座標]が500(オプション:ON)
   ◆変数の操作:[0026〜0028]減算,99
   ◆
  :それ以外の場合
   ◆変数の操作:[0026〜0028]加算,1
   ◆
  :分岐終了
  ◆
 :分岐終了
 ◆
:それ以外の場合
 ◆条件分岐:変数[0014:出力:移動方向]が10より小さい
  ◆変数の操作:[0018:合流→到着変数番号]代入,変数[V[0038]]の値
  ◆変数の操作:[0007〜0009]加算,1
  ◆変数の操作:[V[0008]]代入,6
  ◆指定ラベルへ飛ぶ:20番
  ◆
 :分岐終了
 ◆
:分岐終了
◆注釈:■■■■■■■■■■■■■■
:  :▼到着:右のマスを検索
:  : 

◆変数の操作:[0011:出力:X座標]加算,2<検索するマスの左のマスから右のマスへ変更
◆変数の操作:[0013:出力:変数番号]加算,2<検索するマスの左のマスから右のマスへ変更
◆変数の操作:[0014:出力:移動方向]代入,変数[V[0013]]の値
◆条件分岐:変数[0014:出力:移動方向]が-1以下(オプション:ON)
 ◆指定位置の地形ID取得:(V[0011],V[0012]),[0015:地形ID]
 ◆条件分岐:変数[0015:地形ID]が2(オプション:ON)
  ◆注釈:▼通行不可マス
  ◆変数の操作:[V[0013]]代入,999999
  ◆
 :それ以外の場合
  ◆注釈:▼通行可能マス
  ◆変数の操作:[V[0013]]代入,14
  ◆変数の操作:[V[0026]]代入,変数[0011]の値
  ◆変数の操作:[V[0027]]代入,変数[0012]の値
  ◆変数の操作:[V[0028]]代入,変数[0013]の値
  ◆条件分岐:変数[0026:記憶/到着:次X座標]が500(オプション:ON)
   ◆変数の操作:[0026〜0028]減算,99
   ◆
  :それ以外の場合
   ◆変数の操作:[0026〜0028]加算,1
   ◆
  :分岐終了
  ◆
 :分岐終了
 ◆
:それ以外の場合
 ◆条件分岐:変数[0014:出力:移動方向]が10より小さい
  ◆変数の操作:[0018:合流→到着変数番号]代入,変数[V[0038]]の値
  ◆変数の操作:[0007〜0009]加算,1
  ◆変数の操作:[V[0008]]代入,4
  ◆指定ラベルへ飛ぶ:20番
  ◆
 :分岐終了
 ◆
:分岐終了
◆注釈:■■■■■■■■■■■■■■
:  :▼到着:まだ検索マスがあるかどうかをチェック
:  : 

◆条件分岐:変数[0036:呼出/出発:次X座標]が500(オプション:ON)
 ◆変数の操作:[0036〜0038]減算,99
 ◆
:それ以外の場合
 ◆変数の操作:[0036〜0038]加算,1
 ◆
:分岐終了
◆条件分岐:変数[0017:処理中記憶変数番号]がV[0036]以外
 ◆指定ラベルへ飛ぶ:12番
 ◆
:分岐終了
◆指定ラベルへ飛ぶ:10番<次の歩数を検索するために処理を戻す
◆注釈:
:  :▲ここまでが検索処理
:  :■■■■■■■■■■■■■■■■■■■■■■■■■■■■
◆注釈:
:  :
:  :
:  : 
◆注釈:■■■■■■■■■■■■■■■■■■■■■■■■■■■■
:  :▼最短ルートの作成
:  : 
◆注釈:■■■■■■■■■■■■■■
:  :▼合流地点から出発地点までの移動方向
:  : 

◆ラベルの設定:20番
◆変数の操作:[0007〜0008]減算,1<歩数と移動ルートを保存する変数番号を減算1
◆条件分岐:変数[0007:出発:歩数]が1以上<まだ歩数が残っている時
 ◆変数の操作:[0014:出力:移動方向]代入,変数[V[0013]]の値<移動方向を呼び出す
 ◆変数の操作:[V[0008]]代入,変数[0014]の値<移動方向を最短ルートを記憶する変数に保存
 ◆条件分岐:変数[0014:出力:移動方向]が8<移動方向が8(上)の時
  ◆変数の操作:[0013:出力:変数番号]加算,42<下のマスの変数番号に合わせる
  ◆指定ラベルへ飛ぶ:20番
  ◆
 :分岐終了
 ◆条件分岐:変数[0014:出力:移動方向]が2
  ◆変数の操作:[0013:出力:変数番号]減算,42
  ◆指定ラベルへ飛ぶ:20番
  ◆
 :分岐終了
 ◆条件分岐:変数[0014:出力:移動方向]が4
  ◆変数の操作:[0013:出力:変数番号]加算,1
  ◆指定ラベルへ飛ぶ:20番
  ◆
 :分岐終了
 ◆変数の操作:[0013:出力:変数番号]減算,1
 ◆指定ラベルへ飛ぶ:20番
 ◆
:分岐終了
◆注釈:■■■■■■■■■■■■■■
:  :▼合流地点から到着地点までの移動方向
:  : 

◆ラベルの設定:21番
◆変数の操作:[0006:到着:歩数]減算,1<歩数を減算
◆変数の操作:[0009:到着:最短ルート変数]加算,1<移動ルートを保存する変数番号を加算1
◆条件分岐:変数[0006:到着:歩数]が0以上<まだ歩数が残っている時
 ◆変数の操作:[0014:出力:移動方向]代入,変数[V[0018]]の値<移動方向を呼び出す
 ◆変数の操作:[0014:出力:移動方向]剰余,10<剰余10で移動方向を一の位だけにする
 ◆変数の操作:[V[0009]]代入,変数[0014]の値<移動方向を最短ルートを記憶する変数に保存
 ◆条件分岐:変数[0014:出力:移動方向]が8<移動方向が8(上)の時
  ◆変数の操作:[0018:合流→到着変数番号]減算,42<上のマスの変数番号に合わせる
  ◆指定ラベルへ飛ぶ:21番
  ◆
 :分岐終了
 ◆条件分岐:変数[0014:出力:移動方向]が2
  ◆変数の操作:[0018:合流→到着変数番号]加算,42
  ◆指定ラベルへ飛ぶ:21番
  ◆
 :分岐終了
 ◆条件分岐:変数[0014:出力:移動方向]が4
  ◆変数の操作:[0018:合流→到着変数番号]減算,1
  ◆指定ラベルへ飛ぶ:21番
  ◆
 :分岐終了
 ◆変数の操作:[0018:合流→到着変数番号]加算,1
 ◆指定ラベルへ飛ぶ:21番
 ◆
:分岐終了
◆注釈:■■■■■■■■■■■■■■■■■■■■■■■■■■■■
:  :           最短ルート完成
:  :■■■■■■■■■■■■■■■■■■■■■■■■■■■■




以上で設定完了です。



☆イベントの実行方法
最短ルートの作成は、出発地点と到着地点の座標を変数1〜4番に保存し、
コモンイベントを呼び出すだけです。
▼設定例
◆変数の操作:[0001:出発地点:X座標]代入,出発地点のX座標
◆変数の操作:[0002:出発地点:Y座標]代入,出発地点のY座標
◆変数の操作:[0003:到着地点:X座標]代入,到着地点のX座標
◆変数の操作:[0004:到着地点:Y座標]代入,到着地点のY座標
◆イベントの呼び出し:最短ルート検索


検索結果は変数701〜1000番に保存されます。



☆マップ作成時の注意点
出発地点を中心に上下左右に20マス範囲で検索する事ができますが、
両者の位置地形の形状によっては、正常に機能しない可能性があります。

例えば、下の画像の場合、次に検索するマス116個になりますが、
次に検索するマスを記憶する変数の数は100個までなので、これでは正常な処理はできません。


また下の画像のような場合は、両者の移動距離が879マスもあり、
最短ルートを保存する変数の数300個では対応できません。


このように地形の形状によっては、現状のイベント仕様では対応できない可能性が出てきます。

対策としては、
・変数1001番以降を2001番以降にずらして、1000番までの変数を拡張する。
・一本道や広い空間をあまり作らない。
・上下左右20マス範囲を小さくする。

などが考えられます。



☆変数番号+1000
変数の番号を+1000(変数0001番→変数1001番)に変える場合は、
↓のページをご覧ください。
【変数番号+1000にする時の設定例を見る】



☆補足
マップのループ設定は、イベント設定が大幅に増えるため、現状では未対応です。



◎関連ページ
 ●最短ルート移動に関して
 ○座標の差で移動
 ┣○座標の位置で移動
 ┗
○1マスずつ検索


YADOTトップ  このサイトは何?  気紛れな空間へ戻る  メール