寻找广场上的自由空间来产生敌人

时间:2014-02-18 14:51:26

标签: lua corona

我有一个区域,敌人需要被生成看起来很好(他们在篱笆后面)我不希望敌人相互产生,所以我想知道是否有任何好方法可以做到这一点?

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

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

2 个答案:

答案 0 :(得分:0)

有几个很好的解决方案。

  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然后检查它们以找到合适的位置。

答案 1 :(得分:0)

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

  1. 将你创建的敌人放在两个表中:1 表根据x排序,另一个表按y排序
  2. 选择产生下一个敌人的位置:x,y
  3. 在表1中找到绑定x的两个敌人:是新敌人 close 比R(敌人的大小)到他们中的任何一个(sqrt((x-xi)^ 2 +(y-yi)^ 2)其中 xi,yi是桌上的敌人)?检查所需的任何其他条件。
  4. 如果测试失败,请选择新的x,y并从步骤4开始重复
  5. 如果通过,保存将插入新敌人的索引,并使用y表重复上面的y测试:
  6. 在表2中找到绑定y的两个敌人:是新敌人 close 比R(敌人的大小)到他们中的任何一个(sqrt((x-xi)^ 2 +(y-yi)^ 2)其中 xi,yi是桌上的敌人)?
  7. 如果测试失败,请选择新y,如果仅选择新y
  8. ,则从步骤6开始重复
  9. 如果通过,保存将插入新敌人的索引
  10. 在表1中保存的索引1处插入新敌人,并在表2中保存索引2