赞 | 0 |
VIP | 47 |
好人卡 | 14 |
积分 | 1 |
经验 | 6342 |
最后登录 | 2015-10-31 |
在线时间 | 466 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 50
- 在线时间
- 466 小时
- 注册时间
- 2006-2-25
- 帖子
- 1863
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
RGSS2 Character的通行判定貌似有较大的变动
没有方向的判定了
所以..
想请高手帮忙改下4方向寻路脚本
- #==============================================================================
- # ■ Find_Path
- #------------------------------------------------------------------------------
- # 寻路算法
- # By whbm
- #==============================================================================
- class Find_Path
- #--------------------------------------------------------------------------
- def initialize #初始化
- @open_list = []
- @close_lise = []
- end #结束初始化
- #--------------------------------------------------------------------------
- def fp_passable?(x, y, d) #开始判定通行
- if $game_player.passable?(x, y, d)
- return true
- else
- return false
- end
- end #结束判定通行
- #--------------------------------------------------------------------------
- def get_g(now_point) #开始计算G值
- d = now_point[2]
- return 0 if d == 5
- father_point = get_father_point(now_point)
- g = father_point[3] + 10
- return g
- end #结束计算G值
- #--------------------------------------------------------------------------
- def get_h(now_point) #开始计算H值(曼哈顿方法)
- now_x = now_point[0]
- now_y = now_point[1]
- h = (@trg_x - now_x).abs + (@trg_y - now_y).abs
- return h
- end #结束计算H值
- #--------------------------------------------------------------------------
- def get_f(now_point) #开始计算F值
- f = now_point[3] + now_point[4]
- return f
- end #结束计算F值
- #--------------------------------------------------------------------------
- def get_point(x, y) #取已知坐标点
- if @open_list.size != 0
- @open_list.each do |point|
- if point[0] == x and point[1] == y
- return point
- break
- end
- end
- end
- if @close_list.size != 0
- @close_list.each do |point|
- if point[0] == x and point[1] == y
- return point
- break
- end
- end
- end
- end #结束取已知坐标点
- #--------------------------------------------------------------------------
- def get_father_point(now_point) #取已知点的父节点
- d = now_point[2]
- return now_point if d == 5
- x = now_point[0] + (d == 6 ? 1 : d == 4 ? -1 : 0)
- y = now_point[1] + (d == 2 ? 1 : d == 8 ? -1 : 0)
- return get_point(x, y)
- end #结束取已知点的父节点
- #--------------------------------------------------------------------------
- def new_point(x, y, d) #开始建立新节点
- #print x,y,d
- point = [x, y, d]
- point.push get_g(point)
- point.push get_h(point)
- point.push get_f(point)
- return point
- end #结束建立新节点
- #--------------------------------------------------------------------------
- def find_short_path(self_x, self_y, trg_x, trg_y) #开始搜索路径
- return [] if not (fp_passable?(trg_x, trg_y, 8) or
- fp_passable?(trg_x, trg_y, 4) or
- fp_passable?(trg_x, trg_y, 6) or
- fp_passable?(trg_x, trg_y, 2))
- @self_x = self_x
- @self_y = self_y
- @now_x = self_x
- @now_y = self_y
- @trg_x = trg_x
- @trg_y = trg_y
- @open_list = []
- @close_list = []
- #准备搜索
- #print @self_x,@self_y
- @now_point = new_point(@self_x, @self_y, 5) #令起始点为当前点
- @open_list.push @now_point #将当前点加入关闭列表
- #开始搜索
- loop do
- check_trg = check_around_point(@now_point)
- if check_trg == true
- @path = get_path
- break
- end
- @now_point = get_lowest_f_point
- if @now_point == [] or @now_point == nil
- @path = []
- break
- end
- end
- return @path
- end #结束搜索路径
- #--------------------------------------------------------------------------
- def find_player_short_path(trg_x, trg_y) #寻找角色的最短路径
- self_x = $game_player.x
- self_y = $game_player.y
- return find_short_path(self_x, self_y, trg_x, trg_y)
- end #结束角色的寻找路径
- #--------------------------------------------------------------------------
- def get_path #取得最终的路径
- path = []
- now_point = @open_list[@open_list.size - 1]
- path.push(10 - now_point[2])
- last_point = now_point
- loop do
- now_point = get_father_point(now_point)
- break if now_point[2] == 5
- path.push(10 - now_point[2])
- end
- return path.reverse
- end #结束取得最终的路径
- #--------------------------------------------------------------------------
- def get_lowest_f_point #开始取得最低F值的点
- if @open_list == []
- return []
- end
- last_lowest_f_point = @open_list[0]
- @open_list.each do |point|
- last_lowest_f_point = point if point[5] < last_lowest_f_point[5]
- end
- return last_lowest_f_point
- end #结束取得最低F值点
- #--------------------------------------------------------------------------
- def check_around_point(point) #开始检查已知点的四方节点
- for d in [2, 4, 6, 8]
- x = point[0] + (d == 6 ? 1 : d == 4 ? -1 : 0)
- y = point[1] + (d == 2 ? 1 : d == 8 ? -1 : 0)
- if in_close_list?(x, y) #在关闭列表中
- next
- elsif in_open_list?(x, y) #在开启列表中
- get_new_g_point = new_point(x, y, 10 - d)
- get_last_g_point = get_point(x, y)
- if get_new_g_point[3] >= get_last_g_point[3]
- next
- else
- #如果改变父节点是新G值更小则确定改变
- @open_list[@open_list.index(get_last_g_point)] = get_new_g_point
- end
- else
- if fp_passable?(point[0], point[1], d)
- # 如果不在开启列表中、且不在关闭列表中、且通行则添加它到新八周节点
- @open_list.push new_point(x, y, 10 - d)
- #如果将目标点添加到了开启列表中就返回true
- return true if x == @trg_x and y == @trg_y
- end
- end
- end
- #此刻没有找到目标点并将当前点加入关闭列表并在开启列表中删除
- @close_list.push point
- @open_list.delete(point)
- #此刻没找到目标点并返回false
- return false
- end #结束计算已知点的四方节点
- #--------------------------------------------------------------------------
- def in_open_list?(x, y) #开始检查谋点是否在开启列表中
- @open_list.each do |point|
- return true if point[0] == x and point[1] == y
- end
- return false
- end #结束检查谋点是否在开启列表中
- #--------------------------------------------------------------------------
- def in_close_list?(x, y) #开始检查谋点是否在关闭列表中
- @close_list.each do |point|
- return true if point[0] == x and point[1] == y
- end
- return false
- end #结束检查谋点是否在关闭列表中
- #--------------------------------------------------------------------------
- end
复制代码
原地址:http://rpg.blue/web/htm/news457.htm
本人脑袋太笨了- -
看不太懂别人写的东西
而且里面还有什么G,H,F点和曼哈顿方法什么的
看了头就更晕了- -
希望高手帮忙下
感激 |
|