Project1
标题: 关于VA中的通行度判断,通行检查是怎么判断的? [打印本页]
作者: VIPArcher 时间: 2014-7-5 01:14
标题: 关于VA中的通行度判断,通行检查是怎么判断的?
在VA中的检查通行度是这样的#--------------------------------------------------------------------------
# ● 通行检查
# bit : 判断通行禁止与否的字节(请参照二进制运算)
#--------------------------------------------------------------------------
def check_passage(x, y, bit)
all_tiles(x, y).each do |tile_id|
flag = tileset.flags[tile_id]
next if flag & 0x10 != 0 # [☆] : 不影响通行
return true if flag & bit == 0 # [○] : 可以通行
return false if flag & bit == bit # [×] : 不能通行
end
return false # 不能通行
end
#--------------------------------------------------------------------------
# ● 通行检查
# bit : 判断通行禁止与否的字节(请参照二进制运算)
#--------------------------------------------------------------------------
def check_passage(x, y, bit)
all_tiles(x, y).each do |tile_id|
flag = tileset.flags[tile_id]
next if flag & 0x10 != 0 # [☆] : 不影响通行
return true if flag & bit == 0 # [○] : 可以通行
return false if flag & bit == bit # [×] : 不能通行
end
return false # 不能通行
end
然后对于角色和舟的通行度是这样的#--------------------------------------------------------------------------
# ● 判定普通角色是否可以通行
# d : 方向(2,4,6,8)
# 判断该位置的图块指定方向的通行度。
#--------------------------------------------------------------------------
def passable?(x, y, d)
check_passage(x, y, (1 << (d / 2 - 1)) & 0x0f)
end
#--------------------------------------------------------------------------
# ● 判定小舟是否可以通行
#--------------------------------------------------------------------------
def boat_passable?(x, y)
check_passage(x, y, 0x0002) #我改过,这样可以在陆地上行走和角色一样的。
end
#--------------------------------------------------------------------------
# ● 判定大船是否可以通行
#--------------------------------------------------------------------------
def ship_passable?(x, y)
check_passage(x, y, 0x0400)
end
#--------------------------------------------------------------------------
# ● 判定普通角色是否可以通行
# d : 方向(2,4,6,8)
# 判断该位置的图块指定方向的通行度。
#--------------------------------------------------------------------------
def passable?(x, y, d)
check_passage(x, y, (1 << (d / 2 - 1)) & 0x0f)
end
#--------------------------------------------------------------------------
# ● 判定小舟是否可以通行
#--------------------------------------------------------------------------
def boat_passable?(x, y)
check_passage(x, y, 0x0002) #我改过,这样可以在陆地上行走和角色一样的。
end
#--------------------------------------------------------------------------
# ● 判定大船是否可以通行
#--------------------------------------------------------------------------
def ship_passable?(x, y)
check_passage(x, y, 0x0400)
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 时,是可以通行的。
注意到水域通常都是不可通行的,所以我们可以尝试这么做:
class Game_Map
#--------------------------------------------------------------------------
# ● 判定小舟是否可以通行
#--------------------------------------------------------------------------
def boat_passable?(x, y)
# 四方向皆可通行,通常为陆地 或者 小舟可以通行,通常为水域
check_passage(x, y, 0x000f) || check_passage(x, y, 0x0200)
end
end
class Game_Map
#--------------------------------------------------------------------------
# ● 判定小舟是否可以通行
#--------------------------------------------------------------------------
def boat_passable?(x, y)
# 四方向皆可通行,通常为陆地 或者 小舟可以通行,通常为水域
check_passage(x, y, 0x000f) || check_passage(x, y, 0x0200)
end
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 |