2014-11-06 33 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