【问题标题】:Finding free space in square to spawn enemy在正方形中寻找空闲空间以生成敌人
【发布时间】:2014-02-19 00:14:15
【问题描述】:

我有一个需要生成敌人才能看起来不错的区域(它们在栅栏后面),我不希望敌人在彼此上方生成,所以我想知道是否有任何好的方法可以做到这一点?

http://sv.tinypic.com/r/2zowwu1/8

我创建了一个函数来检查下一个框(下一个敌人)是否适合所有可能的位置(逐个像素),但这会很慢,因为它是一个移动应用程序,并且有时会很快生成敌人。肯定有一个很好的公式可以计算下一个敌人可以适应的不同边界吗?

【问题讨论】:

  • 请给我一些代码好吗?可能更容易理解您要做什么以及如何对其进行优化。
  • 任何答案有帮助吗?您还没有投票或接受任何投票。

标签: lua coronasdk


【解决方案1】:

有几个很好的解决方案。

  1. 快速简单。您只能检查边界。你有一个 2 点为每个正方形的敌人。您可以轻松测试两个矩形是否相交,并且,如果您对 x 坐标进行排序,则可以检查它们之间的间隙。如果间隙大于下一个敌人的宽度 - 检查 y 间隙,然后在那里生成它。

    Here you have  x1_1 == 25, x1_2 == 29, and x2_1 = 10, x2_2 = 15 
    x1_1 is left x coord of enemy 1, x2_2 - rightmost x coord of enemy 2
    after some sorting you will have a gap between x2_1 and x1_2 equal to 25-15==10
    so, you can fit someone here =)
    
  2. 将您的生成位置划分为常规网格,标记为已占领,所有单元格在敌人边界内。检查的不是像素,而是单元格以找到产卵的地方。

    |-----|-----|-----|
    | 1 +-|-2-+ | 3   |   // 1,2,4,5 was ocupied. Very simple check.
    |   | |   | |     |   // You will have to update that info sometimes.
    |---|-|---+-|-----|
    | 4 +---5-+ | 6   |
    |     |     |     |
    |-----|-----|-----|
    
  3. 如果生成点很大,请考虑四叉树,将其分成段 abd,然后检查它们以找到合适的位置。

【讨论】:

    【解决方案2】:

    如果每个敌人占据一个表面 E,而你的区域有表面 S,那么 E/S 是你的区域被一个敌人占据的比例。大概你的 E/S 很小,否则你很难在不重叠的情况下放置许多敌人。因此,如果 E/S 很小,并且您有 N 个敌人,并且 n*E/S 仍然有点小(例如 1/10),那么您很有可能能够随机选择一个位置,然后查看您的列表的敌人并检查你的新敌人 x 是否在任何其他敌人的半径 R 内。如果没有,请尝试新的随机位置。如果你的敌人列表是根据他们的 x 坐标排序的,那么这部分会很快,你平均会节省一半的列表。使用第二个表格沿 y 排序。通常情况下,性能是以内存为代价的(当它基于可用信息量时,就像这里的情况一样)。所以:

    1. 通过将您创建的敌人放在两个表中来跟踪它们:一个 按x排序的表,另一个按y排序的表
    2. 选择生成下一个敌人的位置:x, y
    3. 在表1中找到绑定x的两个敌人:是新的敌人更接近 比 R (敌人大小) 到其中任何一个 (sqrt((x-xi)^2+(y-yi)^2) 哪里 xi,yi 是桌子上的敌人)?检查所需的任何其他条件。
    4. 如果测试失败,选择新的 x、y 并从第 4 步开始重复
    5. 如果通过,保存新敌人将被插入的索引,并使用 y 表对 y 重复上述测试:
    6. 在表 2 中找到绑定 y 的两个敌人:是新的敌人 更接近 比 R (敌人大小) 到其中任何一个 (sqrt((x-xi)^2+(y-yi)^2) 哪里 xi,yi 是桌子上的敌人)?
    7. 如果测试失败,选择新的 y,如果只选择新的 y,则从第 6 步开始重复
    8. 如果通过,保存新敌人将插入的索引
    9. 在表 1 中保存的索引 1 和表 2 中保存的索引 2 处插入新敌人

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-06
      • 2012-05-15
      • 2018-04-17
      • 1970-01-01
      • 1970-01-01
      • 2021-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多