Project1

标题: 关于判定地图某个坐标可否通行的命令 [打印本页]

作者: huajinyu123    时间: 2017-4-22 02:05
标题: 关于判定地图某个坐标可否通行的命令
我使用了 $game_map.passable?(x,y,d)
然而我发现它会忽略事件,包含对事件的判定是哪个命令?
$game_player.passable?(x,y,d)好像也不包含事件呀
我的寻路脚本老出错,几个事件就把人挡住了
用了以上两个命令都没有用
作者: guoxiaomi    时间: 2017-4-22 02:19
参考一下其他人写的寻路脚本呗^_^
作者: RyanBern    时间: 2017-4-22 09:35
本帖最后由 RyanBern 于 2017-4-24 00:27 编辑

这两个方法的含义是:
Game_Map#passable?(x, y, d) 地图上坐标为(x, y)的地方在方向d是否可通行。这个方法只考虑事件图片是地图元件的情况,其他情况不考虑。
Game_Player#passable?(x,y,d) 假设玩家处于(x, y)并且他要往d方向走,那么他是否能走通。这个方法考虑了地图上的所有情况,包括元件,事件等等。
需要额外注意的一点是,假设玩家和事件重叠,并且该处没有其他不可通行的元件时,会被判定为可通行。

所以$game_player.passable?(x, y, d) 可能是你需要的,是不是使用的姿势不对导致的呢?



没有直接判断一个点是不是可通行(并且考虑事件)的方法,需要的话可以自己写。
$game_player.passable?(x, y, d) 表示的是假设角色在(x, y)处,那么他往 d 方向走是否能走通。这里考虑了事件的情况。
可以参考$game_map.passable? 和 $game_player.passable? 的代码,然后自行组合一下。




  1. oeo
  2. oso
  3. xxx
复制代码

例如上面,假设o表示什么都没有,x表示设置了不可通行的图快,e表示设置了一个不可通行的事件(事件的图片不是元件,而是普通的 4x4 行走图)。
假设中心s的坐标是(2, 2),左上角的坐标是(1, 1)。x坐标横向延伸,y坐标纵向延伸。

那么根据这两个 passable? 的代码,可以得到下面结果
RUBY 代码复制
  1. $game_map.passable?(2, 3, 0) # => false, 因为设置了不可通行的图块,0表示全方向不可通行
  2. $game_map.passable?(2, 1, 0) # => true,  (2, 1) 正好是事件的位置,Game_Map#passable? 会忽略使用行走图的事件
  3. $game_player.passable?(2, 2, 4) # => true,  假设主角处于(2, 2),那么左边因为没有障碍,所以可通行
  4. $game_player.passable?(2, 2, 8) # => false, 假设主角处于(2, 2),那么上方因为有事件挡着,不可通行
  5. $game_player.passable?(2, 1, 0) # => true,  假设主角处于(2, 1),他实际上和事件重叠了!这种情况下是全方向可以通行的!
  6. $game_player.passable?(2, 3, 0) # => false, 假设主角处于(2, 3),他正好踩到一个全方向不能通行的图块,因此任何方向不能通行。

请注意上面例子中的坐标,在 Game_Map 中,是读取该坐标的信息并返回通行度;在 Game_Player 中,是将玩家放到这个坐标上考虑,只考虑一个方向,看看是否走得通。请仔细体会这里的区别。

比如,因为(2, 3)这个位置是x,所以角色处于(2, 2)时,你问他往下走能否走通,结论当然是不能。

所以,没有读取该坐标的信息(并考虑事件)并返回通行度的方法。你所能做的只能是从它的邻居考虑。
因此,你给出的代码中,$game_map.passable?(i, j, d, character) && $game_player.passable?(i, j, d),两个判断其实是在说完全不同的事情,如果有必要,我觉得你还是应该把完整的代码发一下。

不知道这些例子能不能解释你的疑问。




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