向世界添加不同大小的对象的最佳解决方案是什么?

What would be best solution for adding different sized objects to world?

我正在开发一个游戏,其中我使用不同大小的物体 - 例如房屋、树木等。我的问题是,我应该以哪种方式确定我要放置我的物体的地方是空的还是空的?每次启动游戏时都会随机生成世界。

(我只使用 x 和 z 坐标)例如,我在项目池中有一棵树,大小为 10x10,位置为 10、0、10,我要添加一块石头,它是例如尺寸 5x5。那我怎么告诉石头"hey you can't place yourself to coordinates from 5 to 15 on x axis and 5 to 15 on z axis, place somewhere else".

是的,一个简单的方法是只写下所有拍摄的坐标 (5,6,7 ... 14,15),但是如果我有 1000 棵树怎么办?有没有更好更快的方法来定位项目的空闲位置,而不是循环遍历坐标列表,这些坐标列表也循环写入占用插槽?

hash-tables 搜索背后的逻辑很有启发性。

提醒我们hash-table:

在 hash-table

中搜索 n
  • 我们先看h(n),其中h是散列函数
  • 命中则报记录,未命中则移至h(n)+1
  • 命中则报记录,未命中则移至h(n)-1
  • 命中则报记录,未命中则移至h(n)+2
  • 命中则报记录,未命中则移至h(n)-2
  • 命中则报记录,未命中则移至h(n)+4
  • 命中则报记录,未命中则移至h(n)-4
  • ...

我们将步长设置为 2^i 序列中的数字及其负数 (0,1,-1,2,-2,4,-4,8,-8,16,...)


现在在您的场景中:

  • 我们先看t,其中t是目标位置。
  • 如果有空就报告位置,如果没有就移到[t.x,t.y+1]。
  • 如果有空就报告位置,如果没有就移到[t.x,t.y-1]。
  • ...
  • 如果有空就报告位置,如果没有就移到[t.x-1,t.y-1]。
  • 如果有空就报告位置,如果没有就移到[t.x,t.y+2]。
  • ...
  • 如果有空就报告位置,如果没有就移到[t.x,t.y+4]。
  • ...

现在我们如何判断一个位置是否空闲?您可以创建一个实际的hash-table 来存储所有对象 位置。现在,当您需要检查 [x,y] 周围的空闲位置来放置石头时,您必须在 hash-table 中搜索 h(x,y)

如果您需要在位置 [x,y] 放置一个更大的物体,例如 3x3 round-shaped 喷泉,您还需要检查这些记录: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)

之后你应该将所有这些位置添加到hash-table中,以便以后更容易找到占用的位置。例如添加 3x3 对象需要向 hash-table.

添加 9 条记录

注意哈希函数应该反映二维(或三维)世界。例如h(x,y) = x*N + y 其中 N 是世界在 y 轴上的最大尺寸。

您可以使用网格系统。或者为了防止对象在放置时重叠,您可以向对象添加一个碰撞器,将其设置为触发器并在放置之前检查它是否与另一个对象发生碰撞。如果你想在物体之间保持一定的距离,你可以让碰撞器更大。