2016-11-06 7 views
0

私は約1年前に作ったフラッシュゲームをリメイクしようとしていますが、love2Dで行っています。私はそれが基本的に終わったので、私はいくつかのことを行って修正することに決めました。群衆/ゾンビの大群の衝突

最初のものは私が回転オブジェクトに対して通常AABB衝突検出を使用し、時には弾丸が直ゾンビを経るということであった(I図を行く、ROBLOXにおける2D衝突のチュートリアルを使用してこれを固定した。)

次のことは、ゾンビ同士が合体するのではなく、衝突したときにゾンビ同士が互いに押し寄せて欲しいということでした。

私が回転2D衝突に使用したチュートリアルでは、衝突したときにオブジェクトを互いに離して移動する方法も示しました。

各ゾンビは、テーブルに格納され、その後、テーブル通じIループは彼らとものを行うために(のような等の更新、それらを描くゾンビが別のクラスを介して作成されている)

をしかし、彼らはしているので、同じテーブル、私は彼らがお互いに衝突していることを確認する方法については本当によく分かりません。

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

入れ子になっているのは何ですか? 'i = 2、main.zombiesはj = 1、i-1はゾンビ[i]とゾンビ[j]エンドエンド – Dimitry

答えて

1

私はDimitryのようにネストされたforループに行きます。

ゾンビの中心点間の距離がゾンビの全幅よりも小さいかどうかを確認し、もしそうならばチェックします。

それはあなたが右の方向性を得るために、最終的な距離計算に+ math.piを追加する必要があり、この

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 

ようになります。

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

はまた、あなたはおそらく、彼らはそれをより滑らかな感触を与えるためにどれだけ近いかに応じて、pushBack変数を動的に変更したいと思います。

またゾンビの動きをどのように処理しているのかわかりませんが、うまくいけば、これはまだ助けになります!

関連する問題