0

我正在使用 Java/Slick 2D 来玩图形并使用鼠标来旋转图像。但是发生了一些奇怪的事情:图像不一定面向鼠标。它与法线呈 45 度角,但距离越远,距离越远。见下图(白色圆圈为鼠标,文字为角度): 80 度的图像 45 度角的图像

这是我使用的轮换代码:

int mX = Mouse.getX();
        int mY = HEIGHT - Mouse.getY();
        int pX = sprite.x;
        int pY = sprite.y;
        int tempY, tempX;
        double mAng, pAng = sprite.angle;
        double angRotate=0;

        if(mX!=pX){
            mAng = Math.toDegrees(Math.atan2(mY - pY, mX - pX));
            if(mAng==0 && mX<=pX)
                mAng=180;
        }
        else{
            if(mY>pY)
                mAng=90;
            else
                mAng=270;
        }

        sprite.angle = mAng;
        sprite.image.setRotation((float) mAng);     

有什么想法吗?我假设它与图像坐标来自左上角的事实有关,但我不知道如何反驳它。仅供参考:屏幕 640x460,图像 128x128 并在窗口中居中。

编辑:不幸的是,那里没有真正起作用。这是一张包含更多信息的图片:

35 度箭头

EDIT2:找到了答案!不得不改变: int px/py = sprite.x/y 到

        int pX = sprite.x+sprite.image.getWidth()/2;
    int pY = sprite.y+sprite.image.getHeight()/2;
4

2 回答 2

2

看起来您从左侧获取鼠标的值并将该距离设置为旋转...这可能会有所帮助:

http://www.instructables.com/id/Using-Java-to-Rotate-an-Object-to-Face-the-Mouse/?ALLSTEPS

于 2012-09-26T21:09:08.077 回答
0

这是我写的类似问题的一些示例代码,可能会有所帮助。

现在它不使用 slick,它使用SwingGraphics2D但它可能会帮助您获得一些想法。

public class TestRotatePane extends JPanel {

    private BufferedImage img;
    private Point mousePoint;

    public TestRotatePane() {

        try {
            img = ImageIO.read(getClass().getResource("/MT02.png"));
        } catch (IOException ex) {
            ex.printStackTrace();
        }

        addMouseMotionListener(new MouseAdapter() {

            @Override
            public void mouseMoved(MouseEvent e) {

                mousePoint = e.getPoint();

                repaint();

            }

        });

    }

    @Override
    public Dimension getPreferredSize() {

        return new Dimension(img.getWidth(), img.getHeight());

    }

    @Override
    protected void paintComponent(Graphics g) {

        super.paintComponent(g);

        Graphics2D g2d = (Graphics2D) g.create();

        double rotation = 0f;

        int width = getWidth() - 1;
        int height = getHeight() - 1;

        if (mousePoint != null) {

            int x = width / 2;
            int y = height / 2;

            int deltaX = mousePoint.x - x;
            int deltaY = mousePoint.y - y;

            rotation = -Math.atan2(deltaX, deltaY);

            rotation = Math.toDegrees(rotation) + 180;

        }

        int x  = (width - img.getWidth()) / 2;
        int y  = (height - img.getHeight()) / 2;

        g2d.rotate(Math.toRadians(rotation), width / 2, height / 2);
        g2d.drawImage(img, x, y, this);

        x = width / 2;
        y = height / 2;
        g2d.setStroke(new BasicStroke(3));
        g2d.setColor(Color.RED);
        g2d.drawLine(x, y, x, y - height / 4);
        g2d.dispose();

    }

}

在此处输入图像描述

显然,您需要提供自己的图像;)

于 2012-09-26T22:51:02.957 回答