本帖最后由 guoxiaomi 于 2017-9-2 11:48 编辑
我下载了 fp.rar 文件,把脚本 - 附加里的 astarmove 方法稍微修改了一下,问题解决了:
def astarmove(to = 0,from = "self") from = @id if from=="self" from = from==0 ? $game_player : $game_map.events[from] to = to==0 ? $game_player : $game_map.events[to] #p from.id,to.id if from.is_a?(Game_Event) unless from.moving? if (from.x-to.x).abs<=1 and (from.y-to.y).abs<=1 else if !@dr @astr = AStar.new($game_map) @astr.set_origin(from.x,from.y) @astr.set_target(to.x,to.y) @dr = @astr.do_search[0..5] else move_dr(@dr.shift) @dr = nil if @dr.empty? end end end end
def astarmove(to = 0,from = "self")
from = @id if from=="self"
from = from==0 ? $game_player : $game_map.events[from]
to = to==0 ? $game_player : $game_map.events[to]
#p from.id,to.id if from.is_a?(Game_Event)
unless from.moving?
if (from.x-to.x).abs<=1 and (from.y-to.y).abs<=1
else
if !@dr
@astr = AStar.new($game_map)
@astr.set_origin(from.x,from.y)
@astr.set_target(to.x,to.y)
@dr = @astr.do_search[0..5]
else
move_dr(@dr.shift)
@dr = nil if @dr.empty?
end
end
end
end
优化的原则是:
1. 并不在每次行走都执行寻路,而是等前一次的寻路完全走完
2. 只取 astar 算法找到的前 5 步,这样即使目标改变也能尽快调整
原来的写法是每走一步都会执行寻路,其实没有必要……
问题出在哪?我并不知道…… |