考虑一个基于平铺的游戏,其中每个智能体可以直线/对角移动(在8个方向上)。基本上,这样的地图可以表示为常规的2D网格,其中0表示可步行的位置,1表示不可步行的位置(我使用Lua):
-- Example : 3x3 sized map
local map = {
{0,0,0},
{0,1,1},
{0,0,0},
}在这一点上,我们如何根据智能体来自的方向来表示瓦片可走性?也就是说,上面的单元格2是静态不可遍历的,如果来自1(上图)或2(左),现在将是可遍历的,但不是,例如,来自3(下)。
我对此有一些想法,但对我来说,我无法提出足够干净的东西。
提前谢谢。
发布于 2012-10-15 18:53:26
我会用单字节覆盖另一个2D网格。字节的每一位都对应于一个可能的入口方向,其中1表示可以从该方向继续前行,0表示不可以。然后,您可以使用二进制掩码检查可入口性。
如果您的大多数单元格都可以从任何方向输入,那么您可以考虑使用一个带有磁贴的绝对ID (例如,X*MaxY+Y)的map作为关键字,并使用上面描述的字节方案来表示可输入性。这是较慢的访问,但占用较少的空间。
例如,让方向按如下方式排列:
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)其中~是not操作。
如果我需要关闭一扇门,比方说向东,我可以取消那个比特:
Enterability(X)=Enterability(X) & (~16)要再次打开门,我使用:
Enterability(X)=Enterability(X) | 16或者,更简单地说,
Enterability(X)|=16~16产生的位域除引用16的位外均为1。将此字段与AND运算符(&)一起使用时,除引用16的位外,所有位均为on。
另请注意,十六进制寻址可能更方便:
Decimal Hexadecimal
1 2 4 0x1 0x2 0x4
8 16 = 0x8 0x10
32 64 128 0x20 0x40 0x80https://stackoverflow.com/questions/12894060
复制相似问题