在广场上寻找自由空间来制造敌人



我有一个区域,敌人需要在那里繁殖才能看起来好看(他们在围栏后面),我不希望敌人在彼此身上繁殖,所以我想知道是否有什么好方法可以做到这一点?

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

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

有几个好的解决方案。

  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. 如果产卵点很大,可以考虑四叉树,将其划分为多个部分,然后检查它们以找到合适的位置。

如果每个敌人占据一个表面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,易是桌上的敌人)?检查所需的任何其他条件
  4. 如果测试失败,请选择新的x、y,然后从步骤4开始重复
  5. 如果通过,保存将插入新敌人的索引,并使用y表对y重复上述测试:
  6. 在表2中找到绑定y的两个敌人:新敌人是否比R(敌人大小)更靠近他们中的任何一个(sqrt((x-xi)^2+(y-yi)^2),其中xi,易是桌上的敌人)
  7. 如果测试失败,请选择新y,如果仅选择新y则从步骤6开始重复
  8. 如果通过,保存将插入新敌人的索引
  9. 在表1中保存的索引1和表2中保存的索引2处插入新敌人

最新更新