Project1

标题: 关于VA中的通行度判断,通行检查是怎么判断的? [打印本页]

作者: VIPArcher    时间: 2014-7-5 01:14
标题: 关于VA中的通行度判断,通行检查是怎么判断的?
在VA中的检查通行度是这样的
RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2.   # ● 通行检查
  3.   #     bit : 判断通行禁止与否的字节(请参照二进制运算)
  4.   #--------------------------------------------------------------------------
  5.   def check_passage(x, y, bit)
  6.     all_tiles(x, y).each do |tile_id|
  7.       flag = tileset.flags[tile_id]
  8.       next if flag & 0x10 != 0            # [☆] : 不影响通行
  9.       return true  if flag & bit == 0     # [○] : 可以通行
  10.       return false if flag & bit == bit   # [×] : 不能通行
  11.     end
  12.     return false                          # 不能通行
  13.   end

然后对于角色和舟的通行度是这样的
RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2.   # ● 判定普通角色是否可以通行
  3.   #     d : 方向(2,4,6,8)
  4.   #    判断该位置的图块指定方向的通行度。
  5.   #--------------------------------------------------------------------------
  6.   def passable?(x, y, d)
  7.     check_passage(x, y, (1 << (d / 2 - 1)) & 0x0f)
  8.   end
  9.   #--------------------------------------------------------------------------
  10.   # ● 判定小舟是否可以通行
  11.   #--------------------------------------------------------------------------
  12.   def boat_passable?(x, y)
  13.     check_passage(x, y, 0x0002)  #我改过,这样可以在陆地上行走和角色一样的。
  14.   end
  15.   #--------------------------------------------------------------------------
  16.   # ● 判定大船是否可以通行
  17.   #--------------------------------------------------------------------------
  18.   def ship_passable?(x, y)
  19.     check_passage(x, y, 0x0400)
  20.   end

然后我要的效果是“小舟”可以在陆地上行走,并可以穿过水域(最好可以用区域或者地形标志判定?)
随便说明一下那个二进制什么的。看着不是很懂
作者: taroxd    时间: 2014-7-5 06:33
本帖最后由 taroxd 于 2014-7-5 07:01 编辑

我们打开F1,在 RPG::TileSet 找到了这样一段说明:
通行度设定。利用一维数组储存着通行度设定(Table 表格类 )。

用这些标识标注可通行状态,其含义如下所示:

0x0001: 不可向下通行
0x0002: 不可向左通行
0x0004: 不可向右通行
0x0008: 不可向上通行
0x0010: 显示优先度在角色之上
0x0020: 梯子
0x0040: 草木繁茂处标记
0x0080: 柜台标记
0x0100: 有害地形
0x0200: 小船无法穿越
0x0400: 大船无法穿越
0x0800: 飞艇无法着陆
0xF000: 地形标志
尽管这与C语言中的位操作有着种种相似之处,但本手册中并不讨论这种东西。我们更建议您在互联网上自行搜索有关十六进制位操作的信息。


分析 check_passage 可知,当位运算结果为 0 时,是可以通行的。

注意到水域通常都是不可通行的,所以我们可以尝试这么做:

RUBY 代码复制
  1. class Game_Map
  2.   #--------------------------------------------------------------------------
  3.   # ● 判定小舟是否可以通行
  4.   #--------------------------------------------------------------------------
  5.   def boat_passable?(x, y)
  6.     # 四方向皆可通行,通常为陆地   或者 小舟可以通行,通常为水域
  7.     check_passage(x, y, 0x000f) || check_passage(x, y, 0x0200)
  8.   end
  9. end


什么?你说要指定方向?那就多加一个参数:方向d吧,和passable?一样。然后在Game_Player调用它的位置(就1个)传入方向的参数。
注意到 0xF000: 地形标志 这一行,说明地形标志也可以拿来判断通行度。如果你愿意的话,这也是个可行的办法。

如果要加方向,两种方式随便你了

=================================================================

至于二进制的位运算,我也不想解释,就看这里吧:http://baike.baidu.com/view/379209.htm

Ruby中的Fixnum定义了&(and运算)、|(or运算)、^(xor运算)、~(not运算)、<<(左移)、>>(右移)这些运算符。意义参考上面的网址。
作者: VIPArcher    时间: 2014-7-5 13:37
taroxd 发表于 2014-7-5 06:33
我们打开F1,在 RPG::TileSet 找到了这样一段说明:

嗯,我懂了。@熊喵酱 结贴发卡




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