设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2454|回复: 1
打印 上一主题 下一主题

[已经解决] xp通行定义

[复制链接]

Lv1.梦旅人

梦石
0
星屑
82
在线时间
124 小时
注册时间
2011-10-6
帖子
26
跳转到指定楼层
1
发表于 2016-3-9 00:40:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
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“这一句是什么意思

Lv4.逐梦者 (版主)

梦石
0
星屑
9532
在线时间
5073 小时
注册时间
2013-6-21
帖子
3580

开拓者贵宾剧作品鉴家

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

参数中的 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

这里如果学过一点编程语言的话应该很好理解,如果没有编程基础,那么在理解有些符号上会有些问题。
  • <<:左移算符,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
回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-9-22 21:30

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表