Java: перемещение изображения в положение мыши

Это Боб:

боб

Я уже знаю, как заставить его вращаться в направлении мыши по этому вопросу: https://stackoverflow.com/posts/26607930/edit


У меня все работает, но при нажатии клавиши он не может перемещать его в направлении мыши.

Вот пример:

import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.RenderingHints; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.SwingUtilities; public class ImageFollowingMouseTest { public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { createAndShowGUI(); } }); } private static void createAndShowGUI() { JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.getContentPane().add(new ImageFollowingMousePanel()); f.setSize(400,400); f.setLocationRelativeTo(null); f.setVisible(true); } } class ImageFollowingMousePanel extends JPanel implements MouseMotionListener { private final BufferedImage image; private Point imagePosition = new Point(150,150); private double imageAngleRad = 0; public ImageFollowingMousePanel() { BufferedImage i = null; try { i = ImageIO.read(new File("6Wu0b.png")); } catch (IOException e) { e.printStackTrace(); } image = i; addMouseMotionListener(this); } protected void paintComponent(Graphics gr) { super.paintComponent(gr); Graphics2D g = (Graphics2D)gr; g.setRenderingHint( RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); int cx = image.getWidth() / 2; int cy = image.getHeight() / 2; AffineTransform oldAT = g.getTransform(); g.translate(cx+imagePosition.x, cy+imagePosition.y); g.rotate(imageAngleRad); g.translate(-cx, -cy); g.drawImage(image, 0, 0, null); g.setTransform(oldAT); } @Override public void mouseDragged(MouseEvent e) { } @Override public void mouseMoved(MouseEvent e) { double dx = e.getX() - imagePosition.getX(); double dy = e.getY() - imagePosition.getY(); imageAngleRad = Math.atan2(dy, dx); repaint(); } } 

Заранее спасибо!

Ответ будет зависеть от того, что вы подразумеваете под «движением к» …

Например, если вы хотите, чтобы «bob» действовал как кошка и преследовал «мышь», вам потребуется какой-то способ непрерывной оценки текущей позиции мыши и положения изображения. Для этого я бы использовал Timer Swing, его простой и не нарушающий правила нитей Swing, например …

боб

 import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.RenderingHints; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.SwingUtilities; import javax.swing.Timer; public class ImageFollowingMouseTest { public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { createAndShowGUI(); } }); } private static void createAndShowGUI() { JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.getContentPane().add(new ImageFollowingMousePanel()); f.setSize(400, 400); f.setLocationRelativeTo(null); f.setVisible(true); } } class ImageFollowingMousePanel extends JPanel implements MouseMotionListener { private final BufferedImage image; private Point imagePosition = new Point(150, 150); private Point mousePoint; private double imageAngleRad = 0; public ImageFollowingMousePanel() { BufferedImage i = null; try { i = ImageIO.read(new File("6Wu0b.png")); } catch (IOException e) { e.printStackTrace(); } image = i; addMouseMotionListener(this); Timer timer = new Timer(40, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (mousePoint != null) { int centerX = imagePosition.x + (image.getWidth() / 2); int centerY = imagePosition.y + (image.getHeight() / 2); if (mousePoint.x != centerX) { imagePosition.x += mousePoint.x < centerX ? -1 : 1; } if (mousePoint.y != centerY) { imagePosition.y += mousePoint.y < centerY ? -1 : 1; } repaint(); } } }); timer.start(); } protected void paintComponent(Graphics gr) { super.paintComponent(gr); Graphics2D g = (Graphics2D) gr; g.setRenderingHint( RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); int cx = image.getWidth() / 2; int cy = image.getHeight() / 2; AffineTransform oldAT = g.getTransform(); g.translate(cx + imagePosition.x, cy + imagePosition.y); g.rotate(imageAngleRad); g.translate(-cx, -cy); g.drawImage(image, 0, 0, null); g.setTransform(oldAT); } @Override public void mouseDragged(MouseEvent e) { } @Override public void mouseMoved(MouseEvent e) { mousePoint = e.getPoint(); double dx = e.getX() - imagePosition.getX(); double dy = e.getY() - imagePosition.getY(); imageAngleRad = Math.atan2(dy, dx); repaint(); } } 
  • Как отключить ускорение колесика мыши в Mac OS?
  • Требуется тип сетки для редактора пикселей
  • Как можно перевернуть движение мыши (ось X и Y) в масштабе всей системы? (Win 7 x64)
  • Как увеличить чувствительность мыши до нормального предела?
  • Отключены ли события USB в Windows 7? (Когда моя мышка была украдена?)
  • В Mac OS X 10.6 есть ли способ отключить триггер, который показывает док-станцию, когда мышь находится на краю экрана?
  • Что означает поддержка «Legacy USB Mouse» в BIOS?
  • Мышь: одиночные клики иногда регистрируются как двойные клики
  • Кнопка Pygame с одним кликом
  • Получить положение мыши
  • Как остановить мышь "пауза"
  • Давайте будем гением компьютера.