gpt4 book ai didi

java - 寻找距离玩家最近的物体(障碍物)

转载 作者:行者123 更新时间:2023-12-01 14:44:16 29 4
gpt4 key购买 nike

我有一个程序可以检查距离以及玩家是否与障碍物发生碰撞。我现在尝试计算障碍数组中的哪个障碍最接近移动的玩家,然后返回该障碍的索引。

这是我到目前为止所拥有的:

    public static int closestBarrier(GameObject object, GameObject[] barriers)
// TODO stub
{
int closest = 0;

for (int i = 0; i < barriers.length - 1; i++) {

if (Math.sqrt((object.getX() - barriers[i].getX())
* (object.getX() - barriers[i].getX()))
+ ((object.getY() - barriers[i].getY()) * (object.getY() - barriers[i]
.getY())) <= Math
.sqrt((object.getX() - barriers[i + 1].getX())
* (object.getX() - barriers[i + 1].getX()))
+ ((object.getY() - barriers[i + 1].getY()) * (object
.getY() - barriers[i + 1].getY()))) {

closest = i;
} else
closest = i + 1;

}

return closest;
}

我对java还是个新手,所以我知道我已经拥有的可能不是很有效或者不是最好的方法(甚至根本正确!?)。

最佳答案

我会将其重构得更简单一些,如下所示:

public static int closestBarrier(GameObject object, GameObject[] barriers)
{
int closest = -1;
float minDistSq = Float.MAX_VALUE;//ridiculously large value to start
for (int i = 0; i < barriers.length - 1; i++) {
GameObject curr = barriers[i];//current
float dx = (object.getX()-curr.getX());
float dy = (object.getY()-curr.getY());
float distSq = dx*dx+dy*dy;//use the squared distance
if(distSq < minDistSq) {//find the smallest and remember the id
minDistSq = distSq;
closest = i;
}
}

return closest;
}

这样你就可以减少距离检查(你的版本每次迭代都会进行两次距离检查),而且你只需要 id,而不是实际距离,因此你可以通过不使用 Math.sqrt() 来获得一点速度。并简单地使用平方距离代替。

我能想到的另一个想法取决于布局。假设您有一个自上而下的垂直滚动器,您将首先检查障碍物的 y 属性。如果您有它们的散列或排序列表,则对于屏幕底部的对象,您将从最大的 y 屏障开始循环到最小的。一旦您找到 Y 轴上最近的障碍物,如果超过 1 个,您可以检查 x 轴上最近的障碍物。您不需要使用平方或平方根,因为您基本上将检查从每个障碍的 2D 中的 1 个检查拆分为 1D 中的 2 个检查,缩小了障碍并丢弃了远处的障碍,而不是针对每个对象进行检查一直。

更高级的版本将使用 space partitioning但希望您在学习时不需要它来玩简单的游戏。

关于java - 寻找距离玩家最近的物体(障碍物),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15606473/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com