Rotación de Java 2d en dirección del punto del mouse

Hasta ahora tengo una aplicación Java donde dibujo un círculo (jugador) y luego dibujo un rectángulo verde en la parte superior (cañón de la pistola). Lo tengo así que cuando el jugador se mueve, el cañón sigue con eso. Quiero que encuentre dónde apunta el mouse y luego gire el barril en consecuencia. Para ver un ejemplo de lo que quiero decir, mira este video. Encontré http://www.youtube.com/watch?v=8W7WSkQq5SU. ¿Ves cómo reactjs la imagen del jugador cuando mueve el mouse?

Aquí hay una imagen de cómo se ve el juego hasta ahora:

Mi progreso

Entonces, ¿cómo lo rotaré así? Por cierto, no me gusta usar affinetransform o la rotación de Graphics2D. Esperaba una mejor manera. Gracias

Usar el método de rotación Graphics2D es de hecho la manera más fácil. Aquí hay una implementación simple:

 int centerX = width / 2; int centerY = height / 2; double angle = Math.atan2(centerY - mouseY, centerX - mouseX) - Math.PI / 2; ((Graphics2D)g).rotate(angle, centerX, centerY); g.fillRect(...); // draw your rectangle 

Si desea eliminar la rotación cuando haya terminado para poder seguir dibujando normalmente, use:

 Graphics2D g2d = (Graphics2D)g; AffineTransform transform = g2d.getTransform(); g2d.rotate(angle, centerX, centerY); g2d.fillRect(...); // draw your rectangle g2d.setTransform(transform); 

Es una buena idea usar Graphics2D todos modos para anti-aliasing, etc.

Usando AffineTransform , lo siento, solo sé cómo: P

 public class RotatePane extends javax.swing.JPanel { private BufferedImage img; private Point mousePoint; /** * Creates new form RotatePane */ public RotatePane() { 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(); } } 

Producirá este efecto

Giratorio

La línea roja (señalar desde el centro) querrá seguir el cursor.