如何让播放器始终指向鼠标

时间:2014-12-09 14:45:39

标签: java

只是为了好玩我以为我会制作游戏小行星。我有点坚持这样一个事实:我无法让玩家始终看到鼠标所在的位置。这是下面的玩家类。

public class Player extends GameObject {

    private int size;

    public Player(float x, float y, int width, int height) {
        super(x, y, width, height);
        size = width / 2 + height / 2;
    }

    public void update() {

    }

    public void render(Graphics g) {
        Point mouse = MouseInfo.getPointerInfo().getLocation();
        int centerX = (int) (mouse.getX() - getX());
        int centerY = (int) (mouse.getY() - getY());
        double angle = Math.toDegrees(Math.atan2(centerY, centerX));

        Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        g2d.setColor(Color.white);
        g2d.rotate(angle, (int) getX() + getWidth() / 2, (int) getY() + getHeight() / 2);
        g2d.drawLine((int) getX() + getWidth() /  2, (int) getY(), (int) getX(), (int) getY() + getHeight());
        g2d.drawLine((int) getX() + getWidth() /  2, (int) getY(), (int) getX() + getWidth(), (int) getY() + getHeight());
        g2d.drawLine((int) getX(), (int) getY() + getHeight(), (int) getX() + getWidth() / 2, (int) getY() + getHeight() - size / 6);
        g2d.drawLine((int) getX() + getWidth(), (int) getY() + getHeight(), (int) getX() + getWidth() / 2, (int) getY() + getHeight() - size / 6); 
    }

    public Rectangle getBounds() {
        return new Rectangle((int) getX(), (int) getY(), getWidth(), getHeight());
    }

    public void setSize(int size) {
        this.size = size;
    }

    public int getSize() {
        return size;
    }

}

我想这有点可行,如果我移动我的鼠标,播放器会旋转,但旋转得非常快。所以我问我做错了什么?在你提问之前,我已经在谷歌上查了一下,发现了一些像这样的问题,但没有人帮助过我。

1 个答案:

答案 0 :(得分:1)

Graphics2D.rotate的参数是弧度,而不是度。尝试从Math.toDegrees参考here的计算中删除angle.

更新: 根据{{​​3}},getLocation给出了屏幕坐标中的鼠标位置,而不是Graphics2D的用户坐标。您需要转换坐标,但如何做到这一点将特定于您的游戏库。

更新2 :假设GameObject以某种方式延伸java.awt.Component,请尝试getLocationOnScreen(参考this comment,来自here):

Point me_absolute = getLocationOnScreen()
int centerX = (int) (mouse.getX() - me_absolute.getX());
int centerY = (int) (mouse.getY() - me_absolute.getY());