2016-05-30 5 views
-1

私は私が私のプレイヤーに最も近いEntityを見つけようとしています、BOX2Dの意識だと今、この割り当て検索最も近いエンティティは

のためにそれを使用することはできません。これは、衝突検出が、一度にすべてではなく、最も近いエンティティに集中できるようにするためです。私はこれをやったやり方は正しいと思ったが、何か誤りがあるようだ。 まず、プロジェクトのいくつかのイメージを見せてください。ここには、最も近いエンティティに正しく気づいたプレイヤーのイメージがあります。

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(); 

ここで、利用可能なエンティティのループに入れて、完了しました。とにかく、私は最も近いエンティティについて心配するつもりはありません、距離があなたに交差するかもしれないことを知らせるときにエンティティを解析するだけです。多くのエンティティがある場合は、「エリア」を追加して、同じエリアにあるものだけをテストすることができます。

関連する問題