vxでイベントの移動ルート先を座標指定にするには

ダイトウ
記事: 12
登録日時: 2016年8月19日(金) 21:15

vxでイベントの移動ルート先を座標指定にするには

投稿記事by ダイトウ » 2018年3月28日(水) 08:57

Vxでイベントの移動先を
指定した座標にしたり、プレイヤーではなく指定したイベントに向かうようにするにはどのように組めば良いでしょうか?スクリプトは全くの無知なもので…
目標までに壁や障害物があっても、自発的に移動可能なルートを検索して進むのが理想です。

faida
記事: 192
登録日時: 2015年12月17日(木) 16:44

Re: vxでイベントの移動ルート先を座標指定にするには

投稿記事by faida » 2018年3月28日(水) 10:55

VXだとデフォルトでは座標指定で移動できないので、コマンドを作ります。

コード: 全て選択

class Game_Character
  #--------------------------------------------------------------------------
  # ● 地点からの X 距離計算
  #--------------------------------------------------------------------------
  def distance_x_from_point(x, y)
    sx = @x - x
    if $game_map.loop_horizontal?         # 横にループしているとき
      if sx.abs > $game_map.width / 2     # 絶対値がマップの半分より大きい?
        sx -= $game_map.width             # マップの幅を引く
      end
    end
    return sx
  end
  #--------------------------------------------------------------------------
  # ● 地点からの Y 距離計算
  #--------------------------------------------------------------------------
  def distance_y_from_point(x, y)
    sy = @y - y
    if $game_map.loop_vertical?           # 縦にループしているとき
      if sy.abs > $game_map.height / 2    # 絶対値がマップの半分より大きい?
        sy -= $game_map.height            # マップの高さを引く
      end
    end
    return sy
  end
  #--------------------------------------------------------------------------
  # ● 地点に近づく
  #--------------------------------------------------------------------------
  def move_toward_point(x, y)
    sx = distance_x_from_point(x, y)
    sy = distance_y_from_point(x, y)
    if sx != 0 or sy != 0
      if sx.abs > sy.abs                  # 横の距離のほうが長い
        sx > 0 ? move_left : move_right   # 左右方向を優先
        if @move_failed and sy != 0
          sy > 0 ? move_up : move_down
        end
      else                                # 縦の距離のほうが長いか等しい
        sy > 0 ? move_up : move_down      # 上下方向を優先
        if @move_failed and sx != 0
          sx > 0 ? move_left : move_right
        end
      end
    end
  end
end
これで「移動ルートの設定」で「move_toward_point(x, y)」とやれば動くはずです。

VXAceではカルトの鳥籠様に経路探索のスクリプト(VXで使用できないと明言あり)がありましたが、
VXでは検索しても見つかりませんね……。
まぁ、昔私が作ったプロジェクトに入ってはいるんですが、抜き出して使うとなるとかなり面倒なので
手が空いていたら素材にするかもしれません。
---------------------------------------------
自作の(改造でない)スクリプト素材に
関しては、リードミーもしくは作中に
「faida」と記名していただければ
利用可能です。
ダイトウ
記事: 12
登録日時: 2016年8月19日(金) 21:15

Re: vxでイベントの移動ルート先を座標指定にするには

投稿記事by ダイトウ » 2018年3月29日(木) 14:11

ありがとうございます!
早速、使わせて頂きました!
そこで失礼ながら質問なのですが、目標座標をイベントキャラにしたり、変数で指定等は出来るのでしょうか?
座標との最短ルート上に壁があっても
自発的に他の道を検索して移動させるにはどのように組めば良いでしょうか?
質問ばかり重ねて申し訳ありません。
よろしければご教授お願いいたします。。
faida
記事: 192
登録日時: 2015年12月17日(木) 16:44

Re: vxでイベントの移動ルート先を座標指定にするには

投稿記事by faida » 2018年3月29日(木) 19:52

目標をイベントにする場合は、イベントの座標を入れてやります。
イベントは「$game_map.events[id]」で取得できるので、後は座標を取得します。
idのところはイベントのIDを入れてください。以下はID2番に近づく処理です。

コード: 全て選択

move_toward_point($game_map.events[2].x, $game_map.events[2].y)
変数はもっと簡単で、「$game_variables[id]」で取得できます。
以下はX座標が変数3番、Y座標が変数4番の座標に近づく処理です。

コード: 全て選択

move_toward_point($game_variables[3], $game_variables[4])

で、肝心の
座標との最短ルート上に壁があっても自発的に他の道を検索して移動させる
ですが、これは現状では無理です。
というのも、提示したスクリプトでは壁の存在を認知する機能がないので、これを使ってどうこうできるものでは
ないからです。
前回の書き込みでVXのスクリプトがないなどと書いたのはその機能があるスクリプトのことです。
一応、ネット上には「経路探索」という名前でアルゴリズムの解説が載っています。
理屈が知りたいだけなら、私が解説するよりそちらを見たほうがよいでしょう。

とはいっても前回書き込みましたように、私も昔同じような機能を作ってたので、現物のスクリプトは存在します。
が、ほとんどプロジェクト専用に組んであるので抜き出して使うには難しいです。
あと、(処理するキャラの数の関係かもしれませんが)処理が重たいのであんまりおすすめできません。
---------------------------------------------
自作の(改造でない)スクリプト素材に
関しては、リードミーもしくは作中に
「faida」と記名していただければ
利用可能です。
ダイトウ
記事: 12
登録日時: 2016年8月19日(金) 21:15

Re: vxでイベントの移動ルート先を座標指定にするには

投稿記事by ダイトウ » 2018年3月30日(金) 08:42

イベントコマンドを駆使して
経路探索が出来ないものか考えましたが
スクリプトでも無理なら仕方ないですね。。

何度もご丁寧に返信ありがとうございました!

“VX / Ace:質問” へ戻る