Project1

标题: 请问有没有RMVXA专用的寻路脚本呢?谢谢。 [打印本页]

作者: ask102    时间: 2012-1-30 21:38
标题: 请问有没有RMVXA专用的寻路脚本呢?谢谢。
本帖最后由 ask102 于 2012-1-30 21:38 编辑

似乎RMXP的不能用在RMVXA上,而我是新手不懂写出这么复杂的算法……
请问有RMVXA专用的寻路脚本吗?谢谢^^
不是鼠标寻路,而是单纯的寻路算法:四方向。

哈哈 刚刚不小心发错区了
作者: 仲秋启明    时间: 2012-1-30 21:39
暂时没有
作者: 叶子    时间: 2012-1-31 05:14
本帖最后由 叶子 于 2012-1-31 05:17 编辑

即插即用的脚本不是很清楚,不过我的一个坑倒是有写过通用的寻路算法
  1. #encoding:utf-8

  2. #==============================================================================
  3. # ■ Dijkstra
  4. #------------------------------------------------------------------------------
  5. #   Dijkstra寻路算法
  6. #==============================================================================

  7. class Dijkstra
  8.   #--------------------------------------------------------------------------
  9.   # ● 实例变量
  10.   #--------------------------------------------------------------------------
  11.   attr_accessor :source
  12.   #--------------------------------------------------------------------------
  13.   # ● 初始化
  14.   #--------------------------------------------------------------------------
  15.   def initialize(source)
  16.     @dist = {}
  17.     @prev = {}
  18.     @source = source
  19.   end
  20.   #--------------------------------------------------------------------------
  21.   # ● 返回max_dist内的节点
  22.   #--------------------------------------------------------------------------
  23.   def nodes
  24.     return @dist.keys
  25.   end
  26.   #--------------------------------------------------------------------------
  27.   # ● 从起点到某一点的距离
  28.   #--------------------------------------------------------------------------
  29.   def dist(node)
  30.     return @dist[node] || Float::INFINITY
  31.   end
  32.   #--------------------------------------------------------------------------
  33.   # ● 设置距离
  34.   #--------------------------------------------------------------------------
  35.   def set_dist(node, n)
  36.     @dist[node] = n
  37.   end
  38.   #--------------------------------------------------------------------------
  39.   # ● 路径前一点
  40.   #--------------------------------------------------------------------------
  41.   def prev(node)
  42.     return @prev[node]
  43.   end
  44.   #--------------------------------------------------------------------------
  45.   # ● 设置路径前一点
  46.   #--------------------------------------------------------------------------
  47.   def set_prev(node, prev)
  48.     @prev[node] = prev
  49.   end
  50.   #--------------------------------------------------------------------------
  51.   # ● 获得路径
  52.   #--------------------------------------------------------------------------
  53.   def get_route(node)
  54.     route = [node]
  55.     while true
  56.       if prev(node) == nil
  57.         return nil
  58.       end
  59.       if prev(node) == @source
  60.         return route
  61.       end
  62.       route.unshift(node)
  63.       node = prev(node)
  64.     end
  65.     return route
  66.   end
  67.   #--------------------------------------------------------------------------
  68.   # ● 类方法:返回寻路结果
  69.   #--------------------------------------------------------------------------
  70.   def self.search(graph, source, max_dist)
  71.     dij = Dijkstra.new(source)
  72.     queue = [source] # 按dij.dist()从近到远的队列
  73.     dij.set_dist(source, 0)
  74.     while !queue.empty?
  75.       u = queue.shift
  76.       graph.each_neighbor(u){|v|
  77.         alt = dij.dist(u) + graph.dist_neighbor(u, v)
  78.         if alt <= max_dist && alt < dij.dist(v)
  79.           dij.set_dist(v, alt)
  80.           dij.set_prev(v, u)
  81.           if !queue.include?(v)
  82.             queue.push(v)
  83.           end
  84.           queue.sort_by{|node| dij.dist(node)}
  85.         end
  86.       }
  87.     end
  88.     return dij
  89.   end
  90. end

  91. #==============================================================================
  92. # ■ Graph
  93. #------------------------------------------------------------------------------
  94. #  图
  95. #==============================================================================

  96. module Graph
  97.   #--------------------------------------------------------------------------
  98.   # ● 迭代邻居
  99.   #--------------------------------------------------------------------------
  100.   def each_neighbor(u)
  101.     raise 'not yet implemented'
  102.   end
  103.   #--------------------------------------------------------------------------
  104.   # ● 返回邻居两点间距离
  105.   #--------------------------------------------------------------------------
  106.   def dist_neighbor(u, v)
  107.     raise 'not yet implemented'
  108.   end
  109. end
复制代码
用例
当然下面这些不能直接在默认VA工程内使用,只是用法参考。
  1. #==============================================================================
  2. # ■ SLGGraph
  3. #------------------------------------------------------------------------------
  4. #  所有方法都以模块方法存在
  5. #==============================================================================
  6. module SLGGraph
  7. end
  8. class << SLGGraph
  9.   include Graph
  10.   #--------------------------------------------------------------------------
  11.   # ● 迭代邻居
  12.   #--------------------------------------------------------------------------
  13.   def each_neighbor(u)
  14.     x, y = u
  15.     if passable?(x, y, 2)
  16.       yield([x, y + 1])
  17.     end
  18.     if passable?(x, y, 4)
  19.       yield([x - 1, y])
  20.     end
  21.     if passable?(x, y, 6)
  22.       yield([x + 1, y])
  23.     end
  24.     if passable?(x, y, 8)
  25.       yield([x, y - 1])
  26.     end
  27.   end
  28.   #--------------------------------------------------------------------------
  29.   # ● 可通行
  30.   #--------------------------------------------------------------------------
  31.   def passable?(x, y, d)
  32.     x2 = $game_map.round_x_with_direction(x, d)
  33.     y2 = $game_map.round_y_with_direction(y, d)
  34.     return false unless $game_map.valid?(x2, y2)
  35.     return false if !$game_map.passable?(x, y, d)
  36.     return false if !$game_map.passable?(x2, y2, 10 - d)
  37.     char_block = Proc.new{|char|
  38.       # 这里不判断priority了,如果想事件可穿透,设置through属性
  39.       if @source_battler != nil
  40.         char.block?(@source_battler)
  41.       else
  42.         true
  43.       end
  44.     }
  45.     return false if $game_map.events_xy_nt(x2, y2).any? do |event|
  46.       char_block.call(event)
  47.     end
  48.     if (battler = $game_slg.get_battler_at(x2, y2)) != nil
  49.       return false if char_block.call(battler)
  50.     end
  51.     return true
  52.   end
  53.   #--------------------------------------------------------------------------
  54.   # ● 返回邻居两点间距离
  55.   #--------------------------------------------------------------------------
  56.   def dist_neighbor(u, v)
  57.     return 1
  58.   end
  59.   #--------------------------------------------------------------------------
  60.   # ● 返回Dijkstra寻路实例
  61.   #--------------------------------------------------------------------------
  62.   def dijkstra_search(source, max_dist)
  63.     if source.is_a?(Array)
  64.       @source_battler = nil
  65.       source_pos = source
  66.     else
  67.       @source_battler = source
  68.       source_pos = [@source_battler.x, @source_battler.y]
  69.     end
  70.     return Dijkstra.search(self, source_pos, max_dist)
  71.   end
  72. end
复制代码

作者: ask102    时间: 2012-1-31 14:54
本帖最后由 ask102 于 2012-1-31 15:00 编辑

非常谢谢各位^^
我先尝试一下自己写看看好了!不行的话再问有没有现成的吧@@"
外站脚本...是指66RPG主站吗?
作者: doubt    时间: 2012-1-31 21:28
也想尝试自已写,算法知道,不过还不太了解RGSS3,问一下判断一格能不能通向另一格的函数是什么?
作者: 叶子    时间: 2012-2-1 00:06
doubt 发表于 2012-1-31 21:28
也想尝试自已写,算法知道,不过还不太了解RGSS3,问一下判断一格能不能通向另一格的函数是什么? ...

话说通行判断3楼的用例里就有啊
$game_map.passable?(x, y, d)  和 $game_map.events_xy_nt(x, y).any?
默认Game_CharacterBase里面基本上也是这两个




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1