2016-05-30 42 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(); 

现在把它放在一个可用的实体循环和你完成。无论如何,我甚至不会担心最接近的实体,只是在距离告诉你它们可能相交时解析这些实体。如果您有很多实体,您可能需要添加“区域”并仅对同一区域进行测试。