2016-11-06 25 views
0

所以我試圖重拍我一年前製作的一款flash遊戲,但在love2D中。我已經到了基本完成的地步,所以我決定去解決一些問題。人羣/殭屍部落碰撞

的第一件事是,我是用在旋轉的物體正常的AABB碰撞檢測,有時子彈將通過殭屍直去(我解決了這個用在roblox 2D碰撞的教程,去圖)

的接下來的事情是我想讓殭屍們在彼此碰撞而不是融入彼此時彼此「推開」。

我用於旋轉2D碰撞的教程還展示瞭如何在碰撞時將對象從彼此移開。

每個殭屍被存儲在一個表,然後我遍歷表爲他們做的東西(比如吸引他們,更新等殭屍通過其他類創建)

但因爲他們是在同樣的桌子,我不確定如何去確保他們與彼此碰撞。

for izom,zom in ipairs(main.zombies) do 
    zom:update(dt) 
    doesCollide,mtv = collide(zom,zom) 
    if collide(zom,zom) then 
     zom.Position = zom.Position + Vector2.new(mtv.x, mtv.y);; 
    end 
end 

我試過了,但它不起作用。

我該如何解決這個問題?

+0

好的ol嵌套的問題是什麼? '對於i = 2,#main.zombies對於j = 1做,i-1對zombie [i]和zombie [j] end end' – Dimitry

回答

1

我會去像Dimitry說的一個嵌套循環。

只要推開去,我會檢查兩個殭屍中心點之間的距離是否小於殭屍的全部寬度,如果這樣推開。

這將是這個樣子

local pushBack=50 --How hard they should push away from eachother 

    --Loop through the zombies table twice 
    for ia,zombiea in ipairs(main.zombies) do 
     for ib,zombieb in ipairs(main.zombies) do 

     --Get the distance between the two zombies 
     local dx = zombiea.x - zombieb.x 
     local dy = zombiea.y - zombieb.y 
     distance = math.sqrt (dx * dx + dy * dy) 

     --If the zombies are touching 
     if distance<zombiea.width then 
      local angle=math.atan2((zombieb.y-zombiea.y),(zombieb.x-zombiea.x)) 

      --Push zombie A 
      zombiea.x=zombiea.x+math.cos(angle)*pushBack*dt 
      zombiea.y=zombiea.y+math.sin(angle)*pushBack*dt 

      --Push zombie B 
      zombiea.x=zombiea.x+math.cos(angle)*pushBack*dt 
      zombiea.y=zombiea.y+math.sin(angle)*pushBack*dt 

     end 
     end 
    end 

您可能需要一個+ math.pi加入到最終的距離計算,以獲得正確的方向。

distance = math.sqrt (dx * dx + dy * dy) + math.pi

你也可能會希望pushBack變量來動態改變取決於他們是多麼接近,給它一個平滑的感覺。

我不知道你是如何處理殭屍的運動,但希望這仍然有幫助!