2014-11-06 39 views
1

移动图像这是Bob:的Java:对鼠标的位置

Bob

我已经知道如何让他旋转朝着老鼠地位得益于这样一个问题: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(); 
    } 
} 

提前感谢!

+0

而运动是如何想工作?如果用户按下“W”,应该向上移动还是向着鼠标移动一长线? – MadProgrammer 2014-12-30 20:56:46

回答

5

答案将取决于你所说的“走向”什么......

例如,如果你想“鲍勃”表现得像一只猫追“老鼠”,那么你就需要一些以连续评估当前鼠标位置和图像位置的方式。为此,我会用一个Swing Timer,它的简单,不违反摇摆的单线程规则,例如...

Bob

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(); 
    } 

} 
+0

你的答案帮了我很多。剩下的唯一问题是,我希望他每次按下某个键(例如向上箭头键)而不是总是移动。 – CrazyBacon 2014-11-09 11:05:59

+0

看看[如何使用密钥绑定](http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html) – MadProgrammer 2014-11-09 12:44:45

+0

请问我可以提供一个特定于我的问题的代码示例吗?这将非常感激。 – CrazyBacon 2014-11-10 15:56:16