Project1

标题: 事件寻路脚本 通行度判断问题 [打印本页]

作者: sky40    时间: 2014-7-8 20:27
标题: 事件寻路脚本 通行度判断问题
本帖最后由 sky40 于 2014-7-8 20:42 编辑

基于八方寻路脚本的 事件寻路功能: 指定事件,从最近节点开始,依次走过目标(x,y)。
第20行的 通行判断应该怎么写(目的是 防止节点上有事件  造成卡死)

RUBY 代码复制
  1. # 使用方法 直接调用脚本
  2. # $goto_id = 事件id
  3. # $goto_xy = [[目标x,目标y],[目标x,目标y],[目标x,目标y]...]
  4. # Reset_goto.new
  5.  
  6. class Reset_goto
  7.  
  8.   def initialize
  9.  
  10.       x = $game_map.events[$goto_id].x
  11.       y = $game_map.events[$goto_id].y
  12.  
  13.       @path = []
  14.  
  15.    #移除不可通行的节点
  16.     a =[]
  17.     for i in 0...$goto_xy.size
  18.       xx = $goto_xy[i][0]
  19.       yy = $goto_xy[i][1]
  20.       if !$game_player.passable?(xx, yy, 4)
  21.          a.push $goto_xy[i]
  22.       end
  23.     end  
  24.     $goto_xy -= a
  25.  
  26.  
  27.  
  28.   if $goto_xy != []
  29.     #寻找最近节点   
  30.        j = (x-$goto_xy[0][0]).abs + (y-$goto_xy[0][1]).abs
  31.        k = 0
  32.     for i in 1...$goto_xy.size
  33.        if j >= (x-$goto_xy[i][0]).abs + (y-$goto_xy[i][1]).abs or j == 0
  34.           j = (x-$goto_xy[i][0]).abs + (y-$goto_xy[i][1]).abs
  35.           k = i
  36.        end
  37.     end
  38.     #计算预设路线
  39.     if j != 0
  40.       @path += Find_Path.new.find_short_path(x,y,$goto_xy[k][0],$goto_xy[k][1])
  41.       for i in k...$goto_xy.size-1
  42.          @path += Find_Path.new.find_short_path($goto_xy[i][0],$goto_xy[i][1],$goto_xy[i+1][0],$goto_xy[i+1][1])
  43.       end
  44.     end
  45.   end
  46.  
  47.       if @path != []
  48.          move
  49.       end
  50.  
  51.   end
  52.  
  53.  
  54. #开始预设路径行走
  55.   def move
  56.  
  57.       turns = [nil,5,1,6,2,nil,3,7,4,8]
  58.       m = RPG::MoveRoute.new
  59.       m.list[0].code = turns[@path[0]]
  60.       for i in [email]1...@path.size[/email]
  61.       j = turns[@path[i]]
  62.       m.list.push(RPG::MoveCommand.new(j))
  63.       end
  64.       m.list.push(RPG::MoveCommand.new(0))
  65.       m.repeat = false
  66.       $game_map.events[$goto_id].force_move_route(m)
  67.  
  68.   end
  69.  
  70. end

作者: batfjtn    时间: 2014-7-8 21:29
本帖最后由 batfjtn 于 2014-7-8 21:33 编辑

在Game_Player`!!

RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2.   # ● 可以通行判定
  3.   #     x : X 坐标
  4.   #     y : Y 坐标
  5.   #     d : 方向 (0,2,4,6,8)  ※ 0 = 全方向不能通行的情况判定 (跳跃用)
  6.   #--------------------------------------------------------------------------
  7.   def passable?(x, y, d)
  8.     # 求得新的坐标
  9.     new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
  10.     new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
  11.     # 坐标在地图外的情况下
  12.     unless $game_map.valid?(new_x, new_y)
  13.       # 不能通行
  14.       return false
  15.     end
  16.     # 调试模式为 ON 并且 按下 CTRL 键的情况下
  17.     if $DEBUG and Input.press?(Input::CTRL)
  18.       # 可以通行
  19.       return true
  20.     end
  21.     super
  22.   end


这里还有一个判断~~!!!

RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2.   # ● 越过目标判定 (不能将相同位置作为启动条件)
  3.   #--------------------------------------------------------------------------
  4.   def over_trigger?
  5.     # 图形是角色、没有开启穿透的情况下
  6.     if @character_name != "" and not @through
  7.       # 启动判定是正面
  8.       return false
  9.     end
  10.     # 地图上的这个位置不能通行的情况下
  11.     unless $game_map.passable?(@x, @y, 0)
  12.       # 启动判定是正面
  13.       return false
  14.     end
  15.     # 启动判定在同位置
  16.     return true
  17.   end

作者: sky40    时间: 2014-7-8 22:01
本帖最后由 sky40 于 2014-7-8 22:40 编辑
batfjtn 发表于 2014-7-8 21:29
在Game_Player`!!

  #--------------------------------------------------------------------------


对不起 问题没有描述清楚,主要是两个问题
1, 被其他 “路过的事件” 或者 “主角” 挡住 目标xy的话
那个 八方寻路脚本 就会卡死,所以要移除那个点

2,还有就是 那个目标xy 被事件/主角 围成死路 这时候 八方寻路也会卡死
想要判断 大概一屏幕内 是否 形成死路 这时候也要,移除那个点

按下面的改法,会绕开 能穿透的事件,目标xy被 事件/主角 围死的问题解决不了。
20行改为
RUBY 代码复制
  1. if !passable?(xx, yy)

再添加
RUBY 代码复制
  1. #判断是否存在事件或主角
  2.   def passable?(x, y)
  3.  
  4.       if $game_player.x == x and $game_player.y == y
  5.           return false
  6.       end
  7.       for event in $game_map.events.values
  8.           if event.x == x and event.y == y
  9.              return false
  10.           end
  11.        end
  12.        return true
  13.   end

作者: batfjtn    时间: 2014-7-9 00:56
sky40 发表于 2014-7-8 22:01
对不起 问题没有描述清楚,主要是两个问题
1, 被其他 “路过的事件” 或者 “主角” 挡住 目标xy的话
那 ...


直通车:http://rpg.blue/forum.php?mod=viewthread&tid=158088

你可以引用这里的方法~~!!

他是自己创建了个通行判定~~!!

代码:
  1. def fp_passable?(x, y, d, tr_x = -2, tr_y = -2)  #开始判定通行
  2.     #return false if (tr_x == @unable_xa or
  3.     ##                tr_x == @unable_xb or
  4.     #               tr_y == @unable_ya or
  5.     #                tr_y == @unable_yb)
  6.     if @character.passable?(x, y, d)
  7.       return true
  8.     else
  9.       return false
  10.     end
  11.   end  #结束判定通行
复制代码
添加了判定角色还有事件~~

然后就可以添加了~~!!

可以去参考下~~~!!
作者: batfjtn    时间: 2014-7-9 17:19
@sky40 你思路跑到死角去了~!!

一直想着系统的判断方式~!!

你都在做新的寻路了~

怎么就不自己再重新写一个判断方式~!!

昨天本来是想测试下的~~!!

可惜连你的工程都没有~~!!

想了解都没办法~~!!!




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