2014-02-18 59 views
1

我有一個區域,敵人需要產生好看(他們在籬笆後面),我不希望敵人產卵超過對方,所以我想知道如果有什麼好方法可以做到這一點?在正方形中尋找自由空間來產生敵人

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

我創建了一個檢查,如果下一個框(上接敵)在所有可能的位置適合(由像素像素),但這是慢,因爲它是一個移動應用程序和敵人可以是函數有時會產生相當快的速度。當然,必須有一個很好的公式來計算下一個敵人可以適應的不同邊界?

+0

請問您能顯示一些代碼嗎?可能會更容易理解你想要做什麼以及如何優化它。 – Kamiccolo

+0

做任何答案的幫助?你還沒有投票或接受任何。 – Schollii

回答

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然後檢查「時間找地方適合。

0

如果每個敵人佔據一個表面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和從第6步重複如果如果通僅選擇新的y
  8. ,保存在那裏新的敵人將被插入
  9. 表1在保存索引1
  10. 插入新的敵人和保存的索引指數2在表2中