设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 1818|回复: 4
打印 上一主题 下一主题

[已经过期] 事件寻路脚本 通行度判断问题

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
710 小时
注册时间
2013-7-26
帖子
52
跳转到指定楼层
1
发表于 2014-7-8 20:27:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 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

Lv1.梦旅人

梦石
0
星屑
50
在线时间
378 小时
注册时间
2013-10-14
帖子
215
2
发表于 2014-7-8 21:29:14 | 只看该作者
本帖最后由 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
最简单的学习方法就是努力回答别人的问题...
任何教程都没有实践来的重要...
XP小问题都能自己解决了,剩下的就是脚本了...
╰⋛⋋⊱⋋๑角⊱☠c色๑⋌⊰⋌⋚╯
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
710 小时
注册时间
2013-7-26
帖子
52
3
 楼主| 发表于 2014-7-8 22:01:55 | 只看该作者
本帖最后由 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

点评

系统自带的判断貌似只有地图模块可否通行~~!!没有别的判断啊~~!! 你的问题不就是无法判断事件之类的吗~~!?  发表于 2014-7-9 17:07
我的意思是说你可以学习他的方法~~!!自己重新写一个通行判断~~!! 他这个判断是读取了角色还有事件~~!! 这样你就可以判断地图外加角色还有事件~~!!   发表于 2014-7-9 17:05
我觉得你还是把你的范例拿出来看下~!! 如果是用别的寻路脚本的话一定有判断四周东西的~~!!  发表于 2014-7-8 23:29
亲~~!!那你的思路就是错误的~~!! 你因该先判断本事件8方向是否存在东西~~!!如果存在~停止运行脚本~~!!  发表于 2014-7-8 23:07
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
378 小时
注册时间
2013-10-14
帖子
215
4
发表于 2014-7-9 00:56:54 | 只看该作者
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  #结束判定通行
复制代码
添加了判定角色还有事件~~

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

可以去参考下~~~!!

点评

他那个寻路算法 ,如果目标被围住,地图略大就会卡死的,也没考虑被主角挡住。 我这个是基于寻路算法上,任意路径全图行走,包括全图绕人巡逻。   发表于 2014-7-9 16:53
最简单的学习方法就是努力回答别人的问题...
任何教程都没有实践来的重要...
XP小问题都能自己解决了,剩下的就是脚本了...
╰⋛⋋⊱⋋๑角⊱☠c色๑⋌⊰⋌⋚╯
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
378 小时
注册时间
2013-10-14
帖子
215
5
发表于 2014-7-9 17:19:15 | 只看该作者
@sky40 你思路跑到死角去了~!!

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

你都在做新的寻路了~

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

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

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

想了解都没办法~~!!!
最简单的学习方法就是努力回答别人的问题...
任何教程都没有实践来的重要...
XP小问题都能自己解决了,剩下的就是脚本了...
╰⋛⋋⊱⋋๑角⊱☠c色๑⋌⊰⋌⋚╯
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-9-30 23:37

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表