我正在开发一个游戏,我使用不同大小的物体 - 例如房屋,树木等。我的问题是,我应该确定哪个方式是我要放置我的物品的地方?每次游戏发布时都会随机生成世界。
(我只使用x和z坐标)例如,我在一个项目池中有一个树,大小为10x10,位置为10,0,10,我要添加一块大小为5x5的石头例如。那么我怎么告诉石头“嘿,你不能把你自己放在x轴上5到15和z轴上5到15的坐标上,放在其他地方”。
是的,一个简单的方法就是记下所有坐标(5,6,7 ...... 14,15),但如果我有1000棵树呢?有没有更好更快的方法来定位项目的自由点,除了循环遍历坐标列表的坐标列表?
答案 0 :(得分:0)
哈希表搜索背后的逻辑可以鼓舞人心。
提醒我们hash-table:
在哈希表中搜索n
时
h(n)
其中h
是哈希函数。我们将步长设置为2 ^ i序列中的数字及其负数(0,1,-1,2,-2,4,-4,8,-8,16,...)
现在在你的场景中:
t
,其中t
是目标位置。现在我们如何判断一个位置是否空闲?您可以创建一个实际的哈希表来存储所有对象位置。现在,当您需要检查[x,y]周围的免费位置以放置石头时,您必须在哈希表中搜索h(x,y)
。
如果您需要在位置[x,y]放置一个更大的物体,如3x3圆形喷泉,您还需要检查这些记录: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轴上世界的最大尺寸。
答案 1 :(得分:0)
您可以使用网格系统。或者为了防止对象在放置时重叠,您只需向对象添加一个对撞机,将其设置为触发器并在放置之前检查它是否与另一个对象发生碰撞。如果你想在物体之间保持一定距离,你可以使对手更大。