私は私が私のプレイヤーに最も近いEntity
を見つけようとしています、BOX2Dの意識だと今、この割り当て検索最も近いエンティティは
のためにそれを使用することはできません。これは、衝突検出が、一度にすべてではなく、最も近いエンティティに集中できるようにするためです。私はこれをやったやり方は正しいと思ったが、何か誤りがあるようだ。 まず、プロジェクトのいくつかのイメージを見せてください。ここには、最も近いエンティティに正しく気づいたプレイヤーのイメージがあります。
あなたが見ることができるように、それは完全に最も近いエンティティを見つけた(黄色の線は、エンティティの最も近い側を指す)
私はコードを表示する前に、私は中にいくつかの変数を説明しましょうコードとそれが何をしているのかを示します。 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;
}
}
ただし、何らかの理由でこれが発生します。私は他のエンティティの下に直接行くとき
は、それが地面を通じてプレイヤーの秋を作るそのためのさらなる実体を認識しています。私は上記のコードでどこが間違っていたかを調べるのに何時間も費やしてきました。なぜトップエンティティが最も近いと認識しているのかわからないようです。この点に関する助けは非常に役に立ちます!