我已经编写了一个脚本,只要有玩家在怪物的距离之内就可以启动。脚本检查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)),并且它大于所需的距离,使怪物沿着怪物玩家矢量移动移动速度或怪物玩家距离中的较短者。