3

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

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

在这一点上,我们如何根据代理来自的方向来表示瓦片的可步行性?即上面的单元格 [2][2],它是静态不可行走的,如果来自 [1][2](上)或 [2][1](左),现在将是可行走的,但不是,例如,来自 [ 3][2](下)。

我对此有过一些想法,但对我来说,我想不出足够干净的东西。

提前致谢。

4

1 回答 1

2

我会用单字节覆盖另一个二维网格。字节的每一位对应一个可能的入口方向,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
于 2012-10-15T10:53:26.277 回答