RPGツクール2000/システム【サイトトップへ戻る】
最短ルート移動
■座標の差で移動
(更新:2020/07/05)


出発地点と到着地点の座標の差から移動方向を決定します。


ショートカット
■特徴とサンプル
■処理構造の説明
■変数
■イベントの設定
■移動速度と移動頻度
■マップのループに対応させる
■別マップへマップイベントをコピーする時の注意点

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


  
■特徴とサンプル

この座標の差で移動は、
出発地点と到着地点の両者のX座標(Y座標)の差から到着地点へ近づける処理になります。

処理内容としては「主人公に近寄る」に近いものですが、この座標の差で移動では
マップイベントからマップイベントへ近寄る」と言った設定もできます。

基本的に障害物を避ける事はできませんが、
1マスのみの障害物(障害物の周りは移動可能)くらいの回避はできます。



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

動作確認用のサンプル内では正常に動いていたイベントが、
制作中の作品にコピー&貼り付けしたら正常に動かなくなった場合は、
明らかにコピー&貼り付けの作業に問題があった事になります。


▲トップへ戻る▲


  
■処理構造の説明

下図の場合、イヌから見てネコの位置は「X+4」「Y+2」の位置になります。
この場合、Xの差の方がYの差よりも距離があるので「右」に移動します。





「X+2」「Y+2」のように、XとYの差が同じである場合は、
ランダムで「右」か「下」に移動します。





基本的にXとYの差を比べて、距離が離れている方を優先して移動しますが、
前方に障害物があって移動できない場合は、もう一方の移動方向で移動します。

例えば下図の場合、通常は「右」に移動しますが、
右側に障害物があるので、もう1つの移動候補である「下」へと移動します。





両者が同じY座標であり、前方に障害物がある場合は、
ランダムで「上」か「下」に移動します。





1マスのみの障害物(障害物の周りは移動可能)くらいの回避はできますが、
障害物が数マス繋がっているような場合は、避ける事ができません。





*補足*

地形IDの取得などで周囲の地形(通行不可など)を読み取って、
その情報から障害物を回避するイベントを一応設定する事はできますが、
数マス先までの簡易的な物しかできない上、処理落ちが発生しやすくなります。


▲トップへ戻る▲


  
■変数

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

変数
番号 名前 使用内容
0001 X座標の差:方向 X座標の移動方向を確認する時に使用
0002 Y座標の差:方向 Y座標の移動方向を確認する時に使用
0003 Y座標の差:距離 Y座標の距離を確認する時に使用
0004 X座標の差:距離 X座標の距離を確認する時に使用
0005 乱数 移動方向をランダムで設定する時に使用
0006 XY イベントの現在位置を確認する時に使用
0101〜200 イベントの移動時間を設定
0201〜300 イベントの現在位置を設定

【変数の一覧表を表示】



イベントの現在位置は「X座標×1000+Y座標」で保存します。

【この現在位置の保存方法の詳しい説明を見る】


▲トップへ戻る▲


  
■イベントの設定

まず移動させるマップイベントを準備してください。

■マップイベント「移動キャラ01」

▼1ページ目

イベント出現条件:なし
イベント開始条件:イベントから触れたとき
グラフィック:自由に設定
移動タイプ:移動しない
移動速度:1/2倍速

イベント実行内容には、主人公がイベントに触れた時に実行するイベントを設定してください。



マップイベントに最短ルートを検索するイベントを設定してください。

キャラクターの動作指定の設定は全て、
移動頻度:8」「動作を繰り返す:OFF」「移動できない場合は無視:ON
になります。

■マップイベント「移動処理」

▼1ページ目

イベント出現条件:必要ならば設定
イベント開始条件:定期的に並列処理する

◆変数の操作:[0101〜0101]減算,1<移動中カウントを減算1
◆注釈:■■■■■■■■■■■■■■■■■■■■■■■■■■■■
:  :▼移動キャラ01
:  : 

◆条件分岐:変数[0101:移動カウント:01]が0以下<移動が完了した時(停止中)
 ◆変数の操作:[0101:移動カウント:01]代入,16<移動時間を設定
 ◆変数の操作:[0201:XY:01]代入,移動キャラ01のX座標
 ◆変数の操作:[0201:XY:01]乗算,1000
 ◆変数の操作:[0201:XY:01]加算,移動キャラ01のY座標
 ◆変数の操作:[0001〜0004]代入,主人公のX座標
 ◆変数の操作:[0001〜0004]減算,移動キャラ01のX座標
 ◆変数の操作:[0002〜0003]代入,主人公のY座標
 ◆変数の操作:[0002〜0003]減算,移動キャラ01のY座標
 ◆条件分岐:変数[0003:Y座標の差:距離]が-1以下<マイナス値をプラス値にする
  ◆変数の操作:[0003:Y座標の差:距離]乗算,-1
  ◆
 :分岐終了
 ◆条件分岐:変数[0004:X座標の差:距離]が-1以下
  ◆変数の操作:[0004:X座標の差:距離]乗算,-1
  ◆
 :分岐終了
 ◆条件分岐:変数[0003:Y座標の差:距離]がV[0004]と同値(オプション:ON)<XとYが同じ距離の時
  ◆注釈:■■■■■■■■■■■■■■
  :  :▼XとYが同じ距離
  :  : 

  ◆条件分岐:変数[0004:X座標の差:距離]が0(オプション:ON)<到着地点と重なっている時
   ◆注釈:▼到着地点に到着
   ◆
  :それ以外の場合<到着地点では無い時
   ◆変数の操作:[0005:乱数]代入,乱数[0〜1]
   ◆条件分岐:変数[0005:乱数]が0(オプション:ON)<左右に移動させる時
    ◆注釈:▼左右移動
    ◆条件分岐:変数[0001:X座標の差:方向]が-1以下(オプション:ON)<左方向に到着地点がある時
     ◆キャラクターの動作指定:移動キャラ01,左を向く,一歩前進
     ◆
    :それ以外の場合<右方向に到着地点がある時
     ◆キャラクターの動作指定:移動キャラ01,右を向く,一歩前進
     ◆
    :分岐終了
    ◆
   :それ以外の場合<上下に移動させる時
    ◆注釈:▼上下移動
    ◆条件分岐:変数[0002:Y座標の差:方向]が-1以下(オプション:ON)<上方向に到着地点がある時
     ◆キャラクターの動作指定:移動キャラ01,上を向く,一歩前進
     ◆
    :それ以外の場合<下方向に到着地点がある時
     ◆キャラクターの動作指定:移動キャラ01,下を向く,一歩前進
     ◆
    :分岐終了
    ◆
   :分岐終了
   ◆
  :分岐終了
  ◆
 :それ以外の場合<XとYが違う距離の時
  ◆条件分岐:変数[0004:X座標の差:距離]がV[0003]以上(オプション:ON)<Xの方が遠い時
   ◆注釈:■■■■■■■■■■■■■■
   :  :▼Xの方が遠い
   :  : 

   ◆条件分岐:変数[0001:X座標の差:方向]が-1以下(オプション:ON)<左方向に到着地点がある時
    ◆キャラクターの動作指定:移動キャラ01,左を向く,一歩前進
    ◆
   :それ以外の場合<右方向に到着地点がある時
    ◆キャラクターの動作指定:移動キャラ01,右を向く,一歩前進
    ◆
   :分岐終了
   ◆
  :それ以外の場合<Yの方が遠い時
   ◆注釈:■■■■■■■■■■■■■■
   :  :▼Yの方が遠い
   :  : 

   ◆条件分岐:変数[0002:Y座標の差:方向]が-1以下(オプション:ON)<上方向に到着地点がある時
    ◆キャラクターの動作指定:移動キャラ01,上を向く,一歩前進
    ◆
   :それ以外の場合<下方向に到着地点がある時
    ◆キャラクターの動作指定:移動キャラ01,下を向く,一歩前進
    ◆
   :分岐終了
   ◆
  :分岐終了
  ◆
 :分岐終了
 ◆
:それ以外の場合<移動中の時
 ◆条件分岐:変数[0101:移動カウント:01]が15<移動開始から60分の1秒経った時
  ◆変数の操作:[0006:XY]代入,移動キャラ01のX座標
  ◆変数の操作:[0006:XY]乗算,1000
  ◆変数の操作:[0006:XY]加算,移動キャラ01のY座標
  ◆条件分岐:変数[0201:XY:01]がV[0006]と同値<移動していない時(移動方向変更)
   ◆注釈:■■■■■■■■■■■■■■
   :  :▼移動していない
   :  : 

   ◆変数の操作:[0101:移動カウント:01]代入,16<移動時間を設定
   ◆条件分岐:移動キャラ01が左を向いている(オプション:ON)<左方向に障害物がある時(上下に移動)
    ◆変数の操作:[0002:Y座標の差:方向]代入,主人公のY座標
    ◆変数の操作:[0002:Y座標の差:方向]減算,移動キャラ01のY座標
    ◆条件分岐:変数[0002:Y座標の差:方向]が0(オプション:ON)<到着地点とY座標が同じ
     ◆変数の操作:[0005:乱数]代入,乱数[0〜1]
     ◆条件分岐:変数[0005:乱数]が0(オプション:ON)
      ◆キャラクターの動作指定:移動キャラ01,上を向く,一歩前進
      ◆
     :それ以外の場合
      ◆キャラクターの動作指定:移動キャラ01,下を向く,一歩前進
      ◆
     :分岐終了
     ◆
    :それ以外の場合<到着地点とY座標が異なる
     ◆条件分岐:変数[0002:Y座標の差:方向]が-1以下(オプション:ON)<上方向に到着地点がある時
      ◆キャラクターの動作指定:移動キャラ01,上を向く,一歩前進
      ◆
     :それ以外の場合<下方向に到着地点がある時
      ◆キャラクターの動作指定:移動キャラ01,下を向く,一歩前進
      ◆
     :分岐終了
     ◆
    :分岐終了
    ◆
   :それ以外の場合<左を向いていない時
    ◆条件分岐:移動キャラ01が右を向いている(オプション:ON)<右方向に障害物がある時(上下に移動)
     ◆変数の操作:[0002:Y座標の差:方向]代入,主人公のY座標
     ◆変数の操作:[0002:Y座標の差:方向]減算,移動キャラ01のY座標
     ◆条件分岐:変数[0002:Y座標の差:方向]が0(オプション:ON)
      ◆変数の操作:[0005:乱数]代入,乱数[0〜1]
      ◆条件分岐:変数[0005:乱数]が0(オプション:ON)
       ◆キャラクターの動作指定:移動キャラ01,上を向く,一歩前進
       ◆
      :それ以外の場合
       ◆キャラクターの動作指定:移動キャラ01,下を向く,一歩前進
       ◆
      :分岐終了
      ◆
     :それ以外の場合
      ◆条件分岐:変数[0002:Y座標の差:方向]が-1以下(オプション:ON)
       ◆キャラクターの動作指定:移動キャラ01,上を向く,一歩前進
       ◆
      :それ以外の場合
       ◆キャラクターの動作指定:移動キャラ01,下を向く,一歩前進
       ◆
      :分岐終了
      ◆
     :分岐終了
     ◆
    :それ以外の場合<上下のどちらかに向いている時(左右に移動)
     ◆変数の操作:[0001:X座標の差:方向]代入,主人公のX座標
     ◆変数の操作:[0001:X座標の差:方向]減算,移動キャラ01のX座標
     ◆条件分岐:変数[0001:X座標の差:方向]が0(オプション:ON)
      ◆変数の操作:[0005:乱数]代入,乱数[0〜1]
      ◆条件分岐:変数[0005:乱数]が0(オプション:ON)
       ◆キャラクターの動作指定:移動キャラ01,左を向く,一歩前進
       ◆
      :それ以外の場合
       ◆キャラクターの動作指定:移動キャラ01,右を向く,一歩前進
       ◆
      :分岐終了
      ◆
     :それ以外の場合
      ◆条件分岐:変数[0001:X座標の差:方向]が-1以下(オプション:ON)
       ◆キャラクターの動作指定:移動キャラ01,左を向く,一歩前進
       ◆
      :それ以外の場合
       ◆キャラクターの動作指定:移動キャラ01,右を向く,一歩前進
       ◆
      :分岐終了
      ◆
     :分岐終了
     ◆
    :分岐終了
    ◆
   :分岐終了
   ◆
  :分岐終了
  ◆
 :分岐終了
 ◆
:分岐終了


以上で設定完了です。



他にも処理するマップイベントがある場合は、移動キャラ01と同じように設定してください。

【移動キャラ02の設定例を見る】


▲トップへ戻る▲


  
■移動速度と移動頻度

移動キャラの移動速度によって…
◆変数の操作:[0101:移動カウント:01]代入,16
に設定する値が変わります。

速度 1/8倍速 1/4倍速 1/2倍速 標準速 2倍速 4倍速
代入値 64 32 16



移動頻度を下げる場合は…
◆条件分岐:変数[0101:移動カウント:01]が0以下
の設定を…
◆条件分岐:変数[0101:移動カウント:01]が-12以下
などと変えてください。


▲トップへ戻る▲


  
■マップのループに対応させる

マップの設定にてマップのループ設定を行っている場合は、追加設定が必要です。

【イベントの追加設定例を見る】


▲トップへ戻る▲


  
■別マップへマップイベントをコピーする時の注意点

移動処理のマップイベントを別のマップへコピーした場合、
移動させるキャラのイベントID異なっていると、関係のないマップイベントが移動したり、
無効なイベントが指定されました」のエラーが発生したりします。



コピー元のマップと同じイベントIDでない場合は、移動処理の修正が必要です。





無効なイベントが指定されました」のエラーが出た場合は、
移動処理イベント実行内容の中に「?」が表示されたイベントコマンドがあるはずです。
この「?」の設定を現在のマップにある移動キャラの合わせて設定し直すと、
エラーが発生しなくなります。




▲トップへ戻る▲



◎関連ページ

●最短ルート移動に関して
┣○座標の差で移動
┣○座標の位置で移動
┣〇監視イベント+主人公がいたマスまで移動する
┗○1マスずつ検索

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