0

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

(我只使用 x 和 z 坐标)例如,我在一个大小为 10x10 的项目池中有树,在位置 10、0、10 中,我将添加一块大小为 5x5 的石头。那么我该如何告诉石头“嘿,您不能将自己放置在 x 轴上 5 到 15 和 z 轴上 5 到 15 的坐标,放在其他地方”。

是的,一个简单的方法是写下所有拍摄的坐标(5,6,7 ... 14,15),但是如果我有 1000 棵树怎么办?除了循环遍历一个坐标列表之外,还有什么更好更快的方法来定位该项目的空闲位置?

4

2 回答 2

0

哈希表搜索背后的逻辑可能是鼓舞人心的。

提醒我们哈希表:

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
  • 如果它是免费的,请报告该位置,如果不是,请移至 [tx,t.y+1]。
  • 如果它是免费的,请报告位置,如果不是,请移至 [tx,ty-1]。
  • ...
  • 如果它是免费的,请报告位置,如果不是,请移至 [tx-1,ty-1]。
  • 如果它是免费的,请报告该位置,如果不是,请移至 [tx,t.y+2]。
  • ...
  • 如果它是免费的,请报告该位置,如果不是,请移至 [tx,t.y+4]。
  • ...

现在我们如何判断一个位置是否免费?您可以创建一个实际的哈希表来存储其中的所有对象位置。现在,当您需要检查 [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 条记录。

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

于 2018-03-22T13:13:51.803 回答
0

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

于 2018-03-22T13:13:57.007 回答