我会用单字节覆盖另一个二维网格。字节的每一位对应一个可能的入口方向,1 表示可以从该方向前进,0 表示不能。然后,您可以使用二进制掩码检查可输入性。
如果您的大部分单元格都可以从任何方向输入,那么您可以考虑使用具有图块的绝对 ID(例如 X*MaxY+Y)的地图作为键,并且上述字节方案指示可输入性。这访问速度较慢,但占用的空间更少。
例如,让方向排列如下:
Bit # X offset Y offset
123 -1 0 1 -1 -1 -1
4 5 -1 0 1 0 0 0
678 -1 0 1 1 1 1
如果我朝东北方向走,这对应于#3 位。我可以通过将上述值转换为位掩码来执行掩码:
1 2 4
8 16
32 64 128
如果以下返回 true,我可以从一个方向进入
Enterability(CurrentX+Xoffset(Dir), CurrentY+Yoffset(Dir)) & BitMask(Dir)
(抱歉,恐怕我不太了解 Lua,无法用那种语言写这篇文章)
编辑
所以,说我的方向等如上,我想要一个只能从北方进入的广场。为此,我设置了第 2 位:
Enterability(X)=2
如果我想要一个可以从北部和西南部进入的广场,我会使用:
Enterability(X)=2 | 64
哪里|
是按位或运算。
如果我想让一个正方形可以从除西边的任何方向输入,我使用:
Enterability(X)=(~8)
~
not 操作在哪里。
如果我需要关上一扇门,对东说,我可以取消设置:
Enterability(X)=Enterability(X) & (~16)
要再次打开门,我使用:
Enterability(X)=Enterability(X) | 16
或者,更简单地说,
Enterability(X)|=16
生成一个位域,除了引用 16 的位之外,它都是 1。将~16
其与 AND 运算符 ( &
) 一起使用会保留所有位,但引用 16 的位除外。
另请注意,十六进制寻址可能更方便:
Decimal Hexadecimal
1 2 4 0x1 0x2 0x4
8 16 = 0x8 0x10
32 64 128 0x20 0x40 0x80