Java LWJGL - 怪物不跟着我,在 2 之间运行

Java LWJGL - Monster not following me, runs between a bounds of 2

我写了一个脚本,只要玩家在怪物的距离内就会被触发。该脚本检查 x 位置是否大于或小于玩家 x,z 是否相同。 (y自动设置为地形)

public int checkWalkX(Vector3f position) {
    if (Math.floor(this.getX()) != Math.floor(position.x)) {
        if(this.getX() > position.x) return 1; //Greater
        if(this.getX() < position.x) return 2; //Less
    } 
    return 0;
}
public int checkWalkZ(Vector3f position) {
    if (Math.floor(this.getZ()) != Math.floor(position.z)) {
        if(this.getZ() > position.z) return 1; //Greater
        if(this.getZ() < position.z) return 2; //Less
    } 
    return 0;
}

public void follow(Player player) {
    walking = false;
    following = true;

    if(checkWalkX(player.getPosition()) == 1) this.setX(this.getX() - mobSpeed);
    else if(checkWalkX(player.getPosition()) == 2) this.setX(this.getX() + mobSpeed);

    if(checkWalkZ(player.getPosition()) == 1) this.setZ(this.getZ() - mobSpeed);
    else if(checkWalkZ(player.getPosition()) == 2) this.setZ(this.getZ() + mobSpeed);

    if(Math.floor(checkWalkX(walkToPosition)) == 0 && Math.floor(checkWalkZ(walkToPosition)) == 0) following = false;
}

出于某种原因,当我运行这个脚本时,怪物只会在2ish的距离内移动。他有点走对路,但他不跟着我。谁知道这是为什么?

您应该省略 Math.floor() 条件。
您现在可以得到的是玩家位于 x=1x=1.99 处的怪物。 Floor 条件会将其缩短为 1 == 1 并声明两者在同一位置。在最坏的情况下,这会使怪物离开 sqrt(2) 的距离。

你可以省略条件得到:

public int checkWalkX(Vector3f position) { 
    if(this.getX() > position.x) return 1; //Greater
    if(this.getX() < position.x) return 2; //Less
    return 0; // equal
}

这样做的缺点是您几乎永远不会得到零回报。怪物总是会移动的。在这里我们来到下一个问题。它总是移动固定的距离。如果 mobspeed 大于距离,这可能导致围绕目标跳跃。

解决这个问题的一种方法是计算怪物到玩家的距离 (dist = sqrt(deltaX^2 + deltaZ^2)),如果这个距离大于使怪物沿着mobspeedmonster-player-distance 距离较短的 monster-player-vector。