2016-05-30 43 views
-1

我知道的Box2D的,不能用於這項任務查找最接近實體向球員Libgdx的Java

現在,我試圖找到最接近Entity我的球員。這是因爲碰撞檢測可以集中在最接近的實體上,而不是一次全部集中在一起。我認爲我這樣做的方式是正確的,但似乎有一些錯誤。 首先讓我給你看一些項目的圖片,這裏是玩家正確注意最接近的實體的圖像。

enter image description here

正如你所看到的,它完美地查找最近的實體(黃線指向實體的最接近側)

之前我展示的代碼,讓我解釋的幾個變量代碼和它在做什麼。所有Entity都是從EntityStage中抓取的。它們全部儲存在HashMap中。我用一把鑰匙找到x和y軸上最接近的實體。然後我看到最後哪個更接近。 keyX是x軸上最接近的實體的關鍵,y軸是keyY

public Entity player, entity; 
private Vector2 tmpVec = new Vector2(), finKeyX = new Vector2(), finKeyY = new Vector2(); 
private Vector2 finalVec = new Vector2(); 
public void getClosestEntity(){ 

    entityHash = entityStage.getMap(); 

    player = entityHash.get("player"); 
    String finalKey = ""; 
    String keyX = "", keyY = ""; 
    for(String key : entityHash.keySet()) 
     if(!key.equals("player")) 
     keyX = keyY = key; 
    for(String key : entityHash.keySet()){ 
     for(int i = 0; i < entityHash.size(); i++){ 
      if(!key.equals(Player.KEY)){ 
       entity = entityHash.get(key); 

       tmpVec.x = Math.abs(entity.getPosition().x - player.getPosition().x); 
       tmpVec.y = Math.abs(entity.getPosition().y - player.getPosition().y); 




       if(Math.abs(entityHash.get(keyX).getPosition().x - player.getPosition().x) > tmpVec.x){ 
        keyX = key; 
       } 

       if(Math.abs(entityHash.get(keyY).getPosition().x - player.getPosition().x) > tmpVec.y){ 
        keyY = key; 
      } 
      } 
     } 

    } 

    if(keyX.equals(keyY)){ 
     finalKey = keyX; 
    } 
    finKeyX = entityHash.get(keyX).getPosition(); 
    finKeyY = entityHash.get(keyY).getPosition(); 

    // if KeyX is closer on X 
    if(Math.abs(finKeyX.x - player.getPosition().x) < Math.abs(finKeyY.x - player.getPosition().x)){ 
     //If keyX is close on Y 
     if(Math.abs(finKeyX.y - player.getPosition().y) < Math.abs(finKeyY.y - player.getPosition().y)){ 
      finalKey = keyX; 
      //if keyY is closer on Y 
     }else{ 
      if(Math.abs(finKeyX.x - finKeyX.y) < Math.abs(finKeyY.y - finKeyY.x)){ 
       finalKey = keyX; 
      }else 
       finalKey = keyY; 
     } 

     //if KeyY is closer on X 
    }else{ 
     //if KeyY is closer on Y 
     if(Math.abs(finKeyX.y - player.getPosition().y) > Math.abs(finKeyY.y - player.getPosition().y)){ 
      finalKey = keyY; 
      //if KeyX is closer on Y 
     }else{ 

      if(Math.abs(finKeyX.x - finKeyX.y) < Math.abs(finKeyY.y - finKeyY.x)){ 
       finalKey = keyY; 
      }else 
       finalKey = keyX; 
     } 

    } 

但是,出於某種原因會發生這種情況。

enter image description here

當我直接去了其他實體下,它承認爲此通過地面使得玩家掉落的另一實體。我花了好幾個小時的時間試圖查看上面代碼中出錯的地方,我似乎無法找到爲什麼它將頂層實體識別爲最接近的實體。在這方面的任何幫助是非常有幫助的!

回答

0

如果你有座標,你可以在它們之間創建一個向量。該向量的長度就是距離。像這樣:

Vector2 source = player.getPosition(); 
Vector2 target = someEntity.getPosition(); 

Vector2 between = source.cpy().sub(target); 
float distance = between.dst(); 

現在把它放在一個可用的實體循環和你完成。無論如何,我甚至不會擔心最接近的實體,只是在距離告訴你它們可能相交時解析這些實體。如果您有很多實體,您可能需要添加「區域」並僅對同一區域進行測試。