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=1 和 x=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)),如果这个距离大于使怪物沿着mobspeed 或 monster-player-distance 距离较短的 monster-player-vector。
我写了一个脚本,只要玩家在怪物的距离内就会被触发。该脚本检查 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 处的怪物。 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)),如果这个距离大于使怪物沿着mobspeed 或 monster-player-distance 距离较短的 monster-player-vector。