在Libgdx Java中找到最接近Player的实体

时间:2016-05-30 03:20:55

标签: java libgdx

我知道Box2D并且无法将其用于此作业

现在,我正在尝试找到与我的播放器最接近的Entity。这样,碰撞检测可以只关注最近的实体,而不是一次关注所有实体。我认为我这样做的方式是正确的,但似乎有一些错误。 首先让我向您展示一些项目的图像,这里是玩家正确注意到最近实体的图像。

enter image description here

如您所见,它可以完美地找到最接近的实体(黄线指向实体的最近一侧)

在我展示代码之前,让我解释一下代码中的一些变量以及它在做什么。所有EntityStage都来自HashMap。它们都存储在keyX中。我使用一个键在x和y轴上找到最接近的实体。然后我看到最后哪个更接近了。 keyY是x轴上最近实体的关键,y轴为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; } }

tableView.reloadData()

然而,出于某种原因,这种情况会发生。

enter image description here

当我直接进入另一个实体时,它会识别出其他实体,让玩家掉到地上。我花了好几个小时试图在上面的代码中看到我出错的地方,而我似乎无法找到为什么它认为最顶层的实体是最接近的。在这方面的任何帮助都非常有帮助!

1 个答案:

答案 0 :(得分:0)

如果你有坐标,你可以在它们之间创建一个向量。该向量的长度是距离。像这样:

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

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

现在将它放在可用实体的循环中并完成。无论如何,我甚至不担心最近的实体,只是在距离告诉你它们可能相交时解析实体。如果你有很多实体,你可能想要添加“区域”,只测试那些区域。