获取玩家正在看的方向?
Get the direction a Player is looking?
我试图获得玩家面对的方向,如北、南、西、东。我创建了这段代码,但有时它不起作用...
package me.Nightfighter001.GlobalSystem.WorldEditor;
import org.bukkit.entity.Player;
public enum Yaw {
NORTH, SOUTH, EAST, WEST;
public static Yaw getYaw(Player p) {
float yaw = p.getLocation().getYaw();
if (yaw > 135 || yaw < -135) {
return Yaw.NORTH;
} else if (yaw < -45) {
return Yaw.EAST;
} else if (yaw > 45) {
return Yaw.WEST;
} else {
return Yaw.SOUTH;
}
}
}
有人可以帮帮我吗?抱歉我的英语不好,谢谢你:)
您可能想试试这个:
private String getDirection(Player player) {
double rot = (player.getLocation().getYaw() - 90) % 360;
if (rot < 0) {
rot += 360.0;
}
if (0 <= rot && rot < 67.5) {
return "N";
} else if (67.5 <= rot && rot < 157.5) {
return "E";
} else if (157.5 <= rot && rot <247.5) {
return "S";
} else if (247.5 <= rot && rot < 360.0) {
return "W";
} else {
return null;
}
}
偏航值的范围从 -360 到 360,因此对于大于 135 或小于 -135 的值,您的代码当前不会显示正确的基本方向。在您的情况下,据我所知,您可以将 360 添加到任何负偏航值以缩短代码(减少检查)。 0 - 45 度和 315 - 360 度的范围是南,45 - 135 度是西,135 - 225 度是北,225 - 315 度是东。代码看起来像这样,我测试了一会儿,它似乎与 f3 调试 menu/screen:
的值匹配
public static CardinalDirection get(Player player) {
float yaw = player.getLocation().getYaw();
if (yaw < 0) {
yaw += 360;
}
if (yaw >= 315 || yaw < 45) {
return CardinalDirection.SOUTH;
} else if (yaw < 135) {
return CardinalDirection.WEST;
} else if (yaw < 225) {
return CardinalDirection.NORTH;
} else if (yaw < 315) {
return CardinalDirection.EAST;
}
return CardinalDirection.NORTH;
}
你可以这样做:
getPlayer().getEyeLocation().getDirection()
标记为正确的答案有效,但理论上偏航也可以有超过 360 度的值(在文档中注明),因此仅处理负值可能会在某些时候导致错误。
此处的代码是您的确切代码,但它使用真正的模数实现来获取 0-360 度范围内的角度。
public static Yaw getYaw(Player p) {
float yaw = p.getLocation().getYaw();
yaw = (yaw % 360 + 360) % 360; // true modulo, as javas modulo is weird for negative values
if (yaw > 135 || yaw < -135) {
return Yaw.NORTH;
} else if (yaw < -45) {
return Yaw.EAST;
} else if (yaw > 45) {
return Yaw.WEST;
} else {
return Yaw.SOUTH;
}
}
我试图获得玩家面对的方向,如北、南、西、东。我创建了这段代码,但有时它不起作用...
package me.Nightfighter001.GlobalSystem.WorldEditor;
import org.bukkit.entity.Player;
public enum Yaw {
NORTH, SOUTH, EAST, WEST;
public static Yaw getYaw(Player p) {
float yaw = p.getLocation().getYaw();
if (yaw > 135 || yaw < -135) {
return Yaw.NORTH;
} else if (yaw < -45) {
return Yaw.EAST;
} else if (yaw > 45) {
return Yaw.WEST;
} else {
return Yaw.SOUTH;
}
}
}
有人可以帮帮我吗?抱歉我的英语不好,谢谢你:)
您可能想试试这个:
private String getDirection(Player player) {
double rot = (player.getLocation().getYaw() - 90) % 360;
if (rot < 0) {
rot += 360.0;
}
if (0 <= rot && rot < 67.5) {
return "N";
} else if (67.5 <= rot && rot < 157.5) {
return "E";
} else if (157.5 <= rot && rot <247.5) {
return "S";
} else if (247.5 <= rot && rot < 360.0) {
return "W";
} else {
return null;
}
}
偏航值的范围从 -360 到 360,因此对于大于 135 或小于 -135 的值,您的代码当前不会显示正确的基本方向。在您的情况下,据我所知,您可以将 360 添加到任何负偏航值以缩短代码(减少检查)。 0 - 45 度和 315 - 360 度的范围是南,45 - 135 度是西,135 - 225 度是北,225 - 315 度是东。代码看起来像这样,我测试了一会儿,它似乎与 f3 调试 menu/screen:
的值匹配 public static CardinalDirection get(Player player) {
float yaw = player.getLocation().getYaw();
if (yaw < 0) {
yaw += 360;
}
if (yaw >= 315 || yaw < 45) {
return CardinalDirection.SOUTH;
} else if (yaw < 135) {
return CardinalDirection.WEST;
} else if (yaw < 225) {
return CardinalDirection.NORTH;
} else if (yaw < 315) {
return CardinalDirection.EAST;
}
return CardinalDirection.NORTH;
}
你可以这样做:
getPlayer().getEyeLocation().getDirection()
标记为正确的答案有效,但理论上偏航也可以有超过 360 度的值(在文档中注明),因此仅处理负值可能会在某些时候导致错误。
此处的代码是您的确切代码,但它使用真正的模数实现来获取 0-360 度范围内的角度。
public static Yaw getYaw(Player p) {
float yaw = p.getLocation().getYaw();
yaw = (yaw % 360 + 360) % 360; // true modulo, as javas modulo is weird for negative values
if (yaw > 135 || yaw < -135) {
return Yaw.NORTH;
} else if (yaw < -45) {
return Yaw.EAST;
} else if (yaw > 45) {
return Yaw.WEST;
} else {
return Yaw.SOUTH;
}
}