我已经编写了一个脚本,只要有玩家在怪物的距离之内就可以启动。脚本检查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 = 1,而怪物在x = 1.99。底限条件会将其缩短为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
}


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

解决此问题的一种方法可能是计算怪物到玩家的距离(dist = sqrt(deltaX ^ 2 + deltaZ ^ 2)),并且它大于所需的距离,使怪物沿着怪物玩家矢量移动移动速度或怪物玩家距离中的较短者。

09-26 19:45