Project1

标题: xp通行定义 [打印本页]

作者: kk9911    时间: 2016-3-9 00:40
标题: xp通行定义
RUBY 代码复制
  1. def passable?(x, y, d, self_event = nil)
  2.     # 被给予的坐标地图外的情况下
  3.     unless valid?(x, y)
  4.       # 不能通行
  5.       return false
  6.     end
  7.     # 方向 (0,2,4,6,8,10) 与障碍物接触 (0,1,2,4,8,0) 后变换
  8.     bit = (1 << (d / 2 - 1)) & 0x0f
  9.     # 循环全部的事件
  10.     for event in events.values
  11.       # 自己以外的元件与坐标相同的情况
  12.       if event.tile_id >= 0 and event != self_event and
  13.          event.x == x and event.y == y and not event.through
  14.         # 如果障碍物的接触被设置的情况下
  15.         if @passages[event.tile_id] & bit != 0
  16.           # 不能通行
  17.           return false
  18.         # 如果全方向的障碍物的接触被设置的情况下
  19.         elsif @passages[event.tile_id] & 0x0f == 0x0f
  20.           # 不能通行
  21.           return false
  22.         # 这以外的优先度为 0 的情况下
  23.         elsif @priorities[event.tile_id] == 0
  24.           # 可以通行
  25.           return true
  26.         end
  27.       end
  28.     end
  29.     # 从层按从上到下的顺序调查循环
  30.     for i in [2, 1, 0]
  31.       # 取得元件 ID
  32.       tile_id = data[x, y, i]
  33.       # 取得元件 ID 失败
  34.       if tile_id == nil
  35.         # 不能通行
  36.         return false
  37.       # 如果障碍物的接触被设置的情况下
  38.       elsif @passages[tile_id] & bit != 0
  39.         # 不能通行
  40.         return false
  41.       # 如果全方向的障碍物的接触被设置的情况下
  42.       elsif @passages[tile_id] & 0x0f == 0x0f
  43.         # 不能通行
  44.         return false
  45.       # 这以外的优先度为 0 的情况下
  46.       elsif @priorities[tile_id] == 0
  47.         # 可以通行
  48.         return true
  49.       end
  50.     end
  51.     # 可以通行
  52.     return true
  53.   end


上面的”# 方向 (0,2,4,6,8,10) 与障碍物接触 (0,1,2,4,8,0) 后变换
    bit = (1 << (d / 2 - 1)) & 0x0f“这一句是什么意思
作者: RyanBern    时间: 2016-3-9 10:00
此处脚本的作用是判断地图上某个地方是否能被主角或者其他事件通过。

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

例如,如果执行
RUBY 代码复制
  1. $game_player.passable?(5, 5, 2)

则该脚本判断的是主角是否能向下通过坐标为(5, 5)的地方。

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

再解释一下这句话的意思。
RUBY 代码复制
  1. bit = (1 << (d / 2 - 1)) & 0x0f

这里如果学过一点编程语言的话应该很好理解,如果没有编程基础,那么在理解有些符号上会有些问题。

然后解释这一句就不难了。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。说明这个图块向左是可通行的。




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