查看: 2825|回复: 1

[已经解决] xp通行定义

[复制链接]
梦石
0
星屑
82
在线时间
124 小时
注册时间
2011-10-6
回帖
17
发表于 2016-3-9 00:40:28 | 显示全部楼层 |阅读模式

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

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

×
[pre lang="ruby"]  def passable?(x, y, d, self_event = nil)
    # 被给予的坐标地图外的情况下
    unless valid?(x, y)
      # 不能通行
      return false
    end
    # 方向 (0,2,4,6,8,10) 与障碍物接触 (0,1,2,4,8,0) 后变换
    bit = (1 << (d / 2 - 1)) & 0x0f
    # 循环全部的事件
    for event in events.values
      # 自己以外的元件与坐标相同的情况
      if event.tile_id >= 0 and event != self_event and
         event.x == x and event.y == y and not event.through
        # 如果障碍物的接触被设置的情况下
        if @passages[event.tile_id] & bit != 0
          # 不能通行
          return false
        # 如果全方向的障碍物的接触被设置的情况下
        elsif @passages[event.tile_id] & 0x0f == 0x0f
          # 不能通行
          return false
        # 这以外的优先度为 0 的情况下
        elsif @priorities[event.tile_id] == 0
          # 可以通行
          return true
        end
      end
    end
    # 从层按从上到下的顺序调查循环
    for i in [2, 1, 0]
      # 取得元件 ID
      tile_id = data[x, y, i]
      # 取得元件 ID 失败
      if tile_id == nil
        # 不能通行
        return false
      # 如果障碍物的接触被设置的情况下
      elsif @passages[tile_id] & bit != 0
        # 不能通行
        return false
      # 如果全方向的障碍物的接触被设置的情况下
      elsif @passages[tile_id] & 0x0f == 0x0f
        # 不能通行
        return false
      # 这以外的优先度为 0 的情况下
      elsif @priorities[tile_id] == 0
        # 可以通行
        return true
      end
    end
    # 可以通行
    return true
  end[/pre]

上面的”# 方向 (0,2,4,6,8,10) 与障碍物接触 (0,1,2,4,8,0) 后变换
    bit = (1 << (d / 2 - 1)) & 0x0f“这一句是什么意思
梦石
0
星屑
9557
在线时间
5074 小时
注册时间
2013-6-21
回帖
3459

开拓者贵宾剧作品鉴家

发表于 2016-3-9 10:00:43 | 显示全部楼层
此处脚本的作用是判断地图上某个地方是否能被主角或者其他事件通过。

参数中的 d 表示通行的方向,2,4,6,8分别表示下,左,右,上。参数中的最后一个参数用于表示判定的事件自身,这个参数在判断某事件是否可以通行某个地方的时候起作用。

例如,如果执行
[pre lang="Ruby"]$game_player.passable?(5, 5, 2)[/pre]
则该脚本判断的是主角是否能向下通过坐标为(5, 5)的地方。

而提到的这一句,就是用来判断通行方向的。我们用2,4,6,8来表示方向,但是实际上地图数据存储方向并不是用这四个数字,而是只用一个整数来表示某个图块的通行4方向。这个整数取值为0~15,这样展开为二进制形式就是正好4个位。如果不清楚二进制表示可以在wikipedia上查询。例如,整数5表示成四位二进制就是0101。如果我们用最后一位表示“下”,倒数第二位表示“左”,倒数第三位表示“右”,倒数第四位表示“上”,数字 0 表示可以通行,数字 1 表示不能通行。那么如果一个图块的通行表示为5(0101),那么这个图块向下和向右是不可通行的,而向上和向左是可通行的。

再解释一下这句话的意思。
[pre lang="Ruby"]bit = (1 << (d / 2 - 1)) & 0x0f[/pre]
这里如果学过一点编程语言的话应该很好理解,如果没有编程基础,那么在理解有些符号上会有些问题。
  • <<:左移算符,a << b 表示将数字 a 的二进制形式左移 b 位,右侧多出的空位用 0 填补。这里 b 必须为整数。例如 5 << 2,就相当于把数字 5(0101) 左移 2 位,变成010100,也就是十进制的 20。其实就相当于乘以 4。
  • &:按位与算符,a & b 表示将数字 a 和 b 化为二进制数之后,右侧对齐,逐个按照位做与运算。也就是说,相同位置的位上,如果两个都是 1,那么结果是 1,否则是 0。空缺的位按照 0 计算。因此,5 & 3的计算结果为 0101 & 0011 = 0001,也就是十进制的 1。
  • 0x0f:十六进制整数。数字前面带有0x字样的表示十六进制数。十六进制中,f相当于十进制的15。

然后解释这一句就不难了。d / 2 - 1 是把2,4,6,8变换成0,1,2,3,实际上,这里 d 可能的取值为0,2,4,6,8,10。2,4,6,8我们已经解释过,而0和10是两个特殊的值,我们用10来表示“全方向”。之后,将整数 1 的二进制左移(d / 2 - 1)位,这样 1 便出现在对应方向的位置上。在这里0和10经过变换之后,后四位都是0,我们只取最后四位,因此最后和0x0f做与运算。

变成了这种形式的作用,在后面已经能体现出来。在脚本38行@passages[tile_id] & bit != 0,这句话就是判定目前位置能否通行。bit是我们进行变换的结果。例如,当前位置图块的通行是5(0101),而我们要判断下方向(d=2)能否通行。那么对 d 进行一下变换得到 0001,然后将0001和0101做与运算,结果是非 0 值,因此这里向下是不可通行的。如果我们要判断左方向(d=4)能否通行,那么对 d 进行一次变换得到 0010,然后和 0101做与运算,结果为 0。说明这个图块向左是可通行的。

点评

感谢认真解答  发表于 2016-3-9 14:13
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部