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 编辑
即插即用的脚本不是很清楚,不过我的一个坑倒是有写过通用的寻路算法
#encoding:utf-8
#==============================================================================
# ■ Dijkstra
#------------------------------------------------------------------------------
# Dijkstra寻路算法
#==============================================================================
class Dijkstra
#--------------------------------------------------------------------------
# ● 实例变量
#--------------------------------------------------------------------------
attr_accessor :source
#--------------------------------------------------------------------------
# ● 初始化
#--------------------------------------------------------------------------
def initialize(source)
@dist = {}
@prev = {}
@source = source
end
#--------------------------------------------------------------------------
# ● 返回max_dist内的节点
#--------------------------------------------------------------------------
def nodes
return @dist.keys
end
#--------------------------------------------------------------------------
# ● 从起点到某一点的距离
#--------------------------------------------------------------------------
def dist(node)
return @dist[node] || Float::INFINITY
end
#--------------------------------------------------------------------------
# ● 设置距离
#--------------------------------------------------------------------------
def set_dist(node, n)
@dist[node] = n
end
#--------------------------------------------------------------------------
# ● 路径前一点
#--------------------------------------------------------------------------
def prev(node)
return @prev[node]
end
#--------------------------------------------------------------------------
# ● 设置路径前一点
#--------------------------------------------------------------------------
def set_prev(node, prev)
@prev[node] = prev
end
#--------------------------------------------------------------------------
# ● 获得路径
#--------------------------------------------------------------------------
def get_route(node)
route = [node]
while true
if prev(node) == nil
return nil
end
if prev(node) == @source
return route
end
route.unshift(node)
node = prev(node)
end
return route
end
#--------------------------------------------------------------------------
# ● 类方法:返回寻路结果
#--------------------------------------------------------------------------
def self.search(graph, source, max_dist)
dij = Dijkstra.new(source)
queue = [source] # 按dij.dist()从近到远的队列
dij.set_dist(source, 0)
while !queue.empty?
u = queue.shift
graph.each_neighbor(u){|v|
alt = dij.dist(u) + graph.dist_neighbor(u, v)
if alt <= max_dist && alt < dij.dist(v)
dij.set_dist(v, alt)
dij.set_prev(v, u)
if !queue.include?(v)
queue.push(v)
end
queue.sort_by{|node| dij.dist(node)}
end
}
end
return dij
end
end
#==============================================================================
# ■ Graph
#------------------------------------------------------------------------------
# 图
#==============================================================================
module Graph
#--------------------------------------------------------------------------
# ● 迭代邻居
#--------------------------------------------------------------------------
def each_neighbor(u)
raise 'not yet implemented'
end
#--------------------------------------------------------------------------
# ● 返回邻居两点间距离
#--------------------------------------------------------------------------
def dist_neighbor(u, v)
raise 'not yet implemented'
end
end
复制代码
用例
当然下面这些不能直接在默认VA工程内使用,只是用法参考。
#==============================================================================
# ■ SLGGraph
#------------------------------------------------------------------------------
# 所有方法都以模块方法存在
#==============================================================================
module SLGGraph
end
class << SLGGraph
include Graph
#--------------------------------------------------------------------------
# ● 迭代邻居
#--------------------------------------------------------------------------
def each_neighbor(u)
x, y = u
if passable?(x, y, 2)
yield([x, y + 1])
end
if passable?(x, y, 4)
yield([x - 1, y])
end
if passable?(x, y, 6)
yield([x + 1, y])
end
if passable?(x, y, 8)
yield([x, y - 1])
end
end
#--------------------------------------------------------------------------
# ● 可通行
#--------------------------------------------------------------------------
def passable?(x, y, d)
x2 = $game_map.round_x_with_direction(x, d)
y2 = $game_map.round_y_with_direction(y, d)
return false unless $game_map.valid?(x2, y2)
return false if !$game_map.passable?(x, y, d)
return false if !$game_map.passable?(x2, y2, 10 - d)
char_block = Proc.new{|char|
# 这里不判断priority了,如果想事件可穿透,设置through属性
if @source_battler != nil
char.block?(@source_battler)
else
true
end
}
return false if $game_map.events_xy_nt(x2, y2).any? do |event|
char_block.call(event)
end
if (battler = $game_slg.get_battler_at(x2, y2)) != nil
return false if char_block.call(battler)
end
return true
end
#--------------------------------------------------------------------------
# ● 返回邻居两点间距离
#--------------------------------------------------------------------------
def dist_neighbor(u, v)
return 1
end
#--------------------------------------------------------------------------
# ● 返回Dijkstra寻路实例
#--------------------------------------------------------------------------
def dijkstra_search(source, max_dist)
if source.is_a?(Array)
@source_battler = nil
source_pos = source
else
@source_battler = source
source_pos = [@source_battler.x, @source_battler.y]
end
return Dijkstra.search(self, source_pos, max_dist)
end
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