我正在开发一个游戏,我使用不同大小的对象 - 例如房屋、树木等。我的问题是,我应该通过哪种方式确定我要放置对象的位置是否空闲?每次启动游戏时都会随机生成世界。
(我只使用 x 和 z 坐标)例如,我在一个大小为 10x10 的项目池中有树,在位置 10、0、10,我将添加一个大小为 5x5 的石头。那么我如何告诉石头“嘿,你不能把自己放在 x 轴上的 5 到 15 坐标和 z 轴上的 5 到 15 坐标,放在其他地方”。
是的,一个简单的方法就是写下所有的坐标(5,6,7 ... 14,15),但是如果我有 1000 棵树呢?除了循环遍历坐标列表之外,是否有更好更快的方法来定位该项目的空闲位置,这些坐标列表也已循环写入到插槽中?
哈希表搜索背后的逻辑可以鼓舞人心。
提醒我们哈希表:
当搜索n
在哈希表
h(n)
哪里h
。我们将步长设置为 2^i 序列中的数字及其负数 (0,1,-1,2,-2,4,-4,8,-8,16,...)
现在在你的场景中:
t
哪里t
。现在我们如何判断一个位置是否免费?您可以创建一个实际的哈希表来存储其中的所有对象位置。现在,当您需要检查 [x,y] 周围的空闲位置以放置石头时,您将不得不在哈希表中搜索h(x,y)
。
如果您需要将像一个3x3的圆形喷泉更大的物体在位置[X,Y]你需要检查这些记录也:h(x+1,y), h(x-1,y), h(x,y+1), h(x,y-1)
。由于它是一个圆形物体,您可以近似该区域以简化并因此h(x+1,y+1), h(x+1,y-1), h(x-1,y+1), h(x-1,y-1)
从您的搜索中删除四个相对位置。
之后,您应该将所有这些位置添加到哈希表中,以便以后更容易找到被占用的位置。例如,添加一个 3x3 对象需要向哈希表添加 9 条记录。
请注意,哈希函数应反映二维(或三维)世界。例如h(x,y) = x*N + y
,N
y 轴上世界的最大尺寸在哪里。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句