我知道Box2D并且无法将其用于此作业
现在,我正在尝试找到与我的播放器最接近的Entity
。这样,碰撞检测可以只关注最近的实体,而不是一次关注所有实体。我认为我这样做的方式是正确的,但似乎有一些错误。
首先让我向您展示一些项目的图像,这里是玩家正确注意到最近实体的图像。
如您所见,它可以完美地找到最接近的实体(黄线指向实体的最近一侧)
在我展示代码之前,让我解释一下代码中的一些变量以及它在做什么。所有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()
然而,出于某种原因,这种情况会发生。
当我直接进入另一个实体时,它会识别出其他实体,让玩家掉到地上。我花了好几个小时试图在上面的代码中看到我出错的地方,而我似乎无法找到为什么它认为最顶层的实体是最接近的。在这方面的任何帮助都非常有帮助!
答案 0 :(得分:0)
如果你有坐标,你可以在它们之间创建一个向量。该向量的长度是距离。像这样:
Vector2 source = player.getPosition();
Vector2 target = someEntity.getPosition();
Vector2 between = source.cpy().sub(target);
float distance = between.dst();
现在将它放在可用实体的循环中并完成。无论如何,我甚至不担心最近的实体,只是在距离告诉你它们可能相交时解析实体。如果你有很多实体,你可能想要添加“区域”,只测试那些区域。