Java:将图像移到鼠标位置
我是鲍勃: 由于这个问题,我已经知道如何使他朝着鼠标位置旋转:Java:将图像移到鼠标位置,java,mouse,Java,Mouse,我是鲍勃: 由于这个问题,我已经知道如何使他朝着鼠标位置旋转: 我让一切正常,但按下一个键时仍无法将他移向鼠标位置 以下是一个例子: 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.MouseMotionListe
我让一切正常,但按下一个键时仍无法将他移向鼠标位置 以下是一个例子:
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”像猫一样追逐“鼠标”,则需要某种方法来连续评估当前鼠标位置和图像位置。为此,我将使用一个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();
}
}
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.Point;
导入java.awt.RenderingHints;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseMotionListener;
导入java.awt.geom.AffineTransform;
导入java.awt.image.buffereImage;
导入java.io.File;
导入java.io.IOException;
导入javax.imageio.imageio;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.SwingUtilities;
导入javax.swing.Timer;
公共级鼠标测试仪{
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
createAndShowGUI();
}
});
}
私有静态void createAndShowGUI(){
JFrame f=新的JFrame();
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 getContentPane().add(新的ImageFollowerMousePanel());
f、 设置大小(400400);
f、 setLocationRelativeTo(空);
f、 setVisible(真);
}
}
类ImageFollowerMousePanel扩展JPanel实现MouseMotionListener{
私有最终缓冲图像;
专用点imagePosition=新点(150150);
专用点鼠标点;
专用双映像角度rad=0;
公共图像鼠标垫(){
BuffereImage i=null;
试一试{
i=ImageIO.read(新文件(“6Wu0b.png”);
}捕获(IOE异常){
e、 printStackTrace();
}
图像=i;
addMouseMotionListener(此);
计时器计时器=新计时器(40,新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
if(鼠标点!=null){
int centerX=imagePosition.x+(image.getWidth()/2);
int centerY=imagePosition.y+(image.getHeight()/2);
if(mousePoint.x!=centerX){
imagePosition.x+=鼠标点.x
你的回答对我帮助很大。剩下的唯一问题是,我希望他在每次我按下一个键(例如向上箭头键)时都会移动,但并非总是这样。请看一看,您能否提供一个关于我问题的代码示例?非常感谢。那么这场运动应该如何运作呢?如果用户按下“W”,bob应该向上移动还是向鼠标移动一条长的a线?