基于2D网格的游戏:代表可通行性

时间:2012-10-15 10:51:11

标签: map path grid path-finding

考虑基于平铺的游戏,每个代理可以直线/对角移动(沿8个方向)。 基本上,像这样的地图可以表示为常规的2D网格,其中0代表一个可步行的位置和1个不可行的位置(我正在使用Lua):

-- Example : 3x3 sized map
local map = {
 {0,0,0},
 {0,1,1},
 {0,0,0},
}

此时,我们如何根据代理商的方向来表示平铺可行性? 即如果来自[1] [2](上图)或[2] [1](左),上面的单元格[2] [2]现在可以步行,但是不是,例如,来自[3] ] [2](下)。

我已经给了一些想法,但我无法想出足够干净的东西给我。

提前致谢。

1 个答案:

答案 0 :(得分:2)

我用另一个字节覆盖另一个2D网格。字节的每个位对应于可能的入口方向,其中1表示可以从该方向走,0表示不。然后,您可以使用二进制掩码检查是否具有可访问性。

如果您可以从任何方向输入大多数单元格,那么您可以考虑使用map作为关键字块的绝对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

其中|是按位OR运算。

如果我想要一个方格可以从任何方向进入,而是西方我使用:

Enterability(X)=(~8)

其中~是非操作。

如果我需要关上一扇门,对东方说,我可以解开这一点:

Enterability(X)=Enterability(X) & (~16)

再次打开门,我使用:

Enterability(X)=Enterability(X) | 16

或者更简单地说,

Enterability(X)|=16

~16产生一个位域,除了引用16的位之外都是1。使用AND运算符(&)将所有位保持打开,除了引用16的位。

另请注意,十六进制寻址可能更方便:

 Decimal          Hexadecimal
1   2   4       0x1  0x2  0x4
8      16   =   0x8       0x10
32 64 128       0x20 0x40 0x80