首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于2D网格的游戏:表示通过性

基于2D网格的游戏:表示通过性
EN

Stack Overflow用户
提问于 2012-10-15 18:51:11
回答 1查看 632关注 0票数 3

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

代码语言:javascript
复制
-- Example : 3x3 sized map
local map = {
 {0,0,0},
 {0,1,1},
 {0,0,0},
}

在这一点上,我们如何根据智能体来自的方向来表示瓦片可走性?也就是说,上面的单元格2是静态不可遍历的,如果来自1(上图)或2(左),现在将是可遍历的,但不是,例如,来自3(下)。

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

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-15 18:53:26

我会用单字节覆盖另一个2D网格。字节的每一位都对应于一个可能的入口方向,其中1表示可以从该方向继续前行,0表示不可以。然后,您可以使用二进制掩码检查可入口性。

如果您的大多数单元格都可以从任何方向输入,那么您可以考虑使用一个带有磁贴的绝对ID (例如,X*MaxY+Y)的map作为关键字,并使用上面描述的字节方案来表示可输入性。这是较慢的访问,但占用较少的空间。

例如,让方向按如下方式排列:

代码语言:javascript
复制
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。我可以通过将上面的值转换为位掩码来执行掩码:

代码语言:javascript
复制
1   2   4
8      16
32 64 128

如果下面返回true,我可以从一个方向进入

代码语言:javascript
复制
Enterability(CurrentX+Xoffset(Dir), CurrentY+Yoffset(Dir)) & BitMask(Dir)

(对不起,恐怕我对Lua的了解不够深,无法用该语言来写这篇文章)

编辑

所以,说我的方向等如上所述,我想要一个广场,只能从北方进入。为此,我设置了第2位:

代码语言:javascript
复制
Enterability(X)=2

如果我想要一个可以从北面和西南面进入的正方形,我会使用:

代码语言:javascript
复制
Enterability(X)=2 | 64

其中|是按位OR操作。

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

代码语言:javascript
复制
Enterability(X)=(~8)

其中~是not操作。

如果我需要关闭一扇门,比方说向东,我可以取消那个比特:

代码语言:javascript
复制
Enterability(X)=Enterability(X) & (~16)

要再次打开门,我使用:

代码语言:javascript
复制
Enterability(X)=Enterability(X) | 16

或者,更简单地说,

代码语言:javascript
复制
Enterability(X)|=16

~16产生的位域除引用16的位外均为1。将此字段与AND运算符(&)一起使用时,除引用16的位外,所有位均为on。

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

代码语言:javascript
复制
 Decimal          Hexadecimal
1   2   4       0x1  0x2  0x4
8      16   =   0x8       0x10
32 64 128       0x20 0x40 0x80
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12894060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档