Вращение Java 2d в направлении мыши
Пока у меня есть приложение java, где я рисую круг (игрок), а затем нарисую зеленый прямоугольник сверху (пушка). У меня это так, когда игрок движется, борец следует за ним. Я хочу, чтобы он нашел, где указала мышь, а затем соответствующим образом поверните бочку. Пример того, что я имею в виду, смотрю на это видео, я нашел http://www.youtube.com/watch?v=8W7WSkQq5SU . Как реагирует изображение игрока, когда он перемещает мышь?
Вот изображение того, как выглядит игра до сих пор:
- Android: как повернуть bitmap по центральной точке
- input type = "image" показывает нежелательную границу в Chrome и неработающую ссылку в IE7
- Как получить значения RGB для пикселя на изображении на iphone
- Повернуть изображение вокруг символа (JAVA)
- Image.Save (..) генерирует исключение GDI +, поскольку stream памяти закрыт
Итак, как мне повернуть его так? Btw Мне не нравится использование affinetransform или Graphics2D вращения. Я надеялся на лучший путь. благодаря
- iPhone - Как вы можете покрасить изображение?
- Ошибка WPF: не удается найти управляющий элемент FrameworkElement для целевого элемента
- Должен ли я хранить мои изображения в базе данных или папках?
- Изменение размера изображения в Markdown
- Как использовать httpwebrequest для вывода изображения с сайта на локальный файл
- Распознавание латинских знаков - определение цветового диапазона для сравнения пикселей
- Обнаружение монет (и совпадающих эллипсов) на изображении
- Странная проблема с памятью при загрузке изображения в объект Bitmap
Использование метода вращения Graphics2D
действительно самый простой способ. Вот простая реализация:
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
Если вы хотите удалить поворот, когда вы закончите, чтобы продолжить рисовать, используйте:
Graphics2D g2d = (Graphics2D)g; AffineTransform transform = g2d.getTransform(); g2d.rotate(angle, centerX, centerY); g2d.fillRect(...); // draw your rectangle g2d.setTransform(transform);
Это хорошая идея просто использовать Graphics2D
любом случае для сглаживания и т. Д.
Использование AffineTransform
, извините, только так, как я знаю, как: 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(); } }
Будет производить этот эффект
Красная линия (точка из центра) захочет следовать за курсором.