获取玩家正在寻找的方向?

时间:2016-03-06 19:42:28

标签: java minecraft bukkit

我试图获得方向,如北,南,西,东,一个球员面对。我创建了这段代码,但有时它不起作用......

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;
        }
    }
}

有人可以帮帮我吗?抱歉我的英文不好,谢谢你:))

4 个答案:

答案 0 :(得分:2)

偏航值的范围为-360到360,因此对于大于135或小于-135的值,您的代码当前不会显示正确的基本方向。在您的情况下,据我所知,您可以将360添加到任何负偏航值以缩短代码(减少检查)。然后是0到45度和315到360度的范围,向西45 - 135度,北向135 - 225度,东向225 - 315度。代码看起来像这样,我测试了一段时间,它似乎匹配f3调试菜单/屏幕的值:

    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;
}

答案 1 :(得分:1)

被标记为正确答案的答案,但是从理论上讲,偏航角也可以具有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;
    }
}

答案 2 :(得分:0)

您可能想尝试一下:

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;
    }
}

答案 3 :(得分:0)

你可以这样做:

getPlayer()。getEyeLocation()。getDirection()