我正在制作一个简单的乒乓球Java游戏,其中有一个球拍和一个球。但是,我成功地在球拍上实现了一个mouseWheel来移动。我想改为使用mouseDragged事件。我是Java新手,这些鼠标事件真的令人困惑。
这是我的网球课:
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
public class Racquet {
private static final int Y = 330;
private static final int HEIGHT = 10;
int x = 0;
int xa = 0;
static int WIDTH = 60;
private Game game;
public Racquet(Game game) {
this.game = game;
}
public Racquet(Game game, int WIDTH) {
this.WIDTH = WIDTH;
}
public void move() {
if (x + xa > 0 && x + xa < game.getWidth() - WIDTH)
x = x + xa;
}
public void paint(Graphics2D g) {
g.fillRect(x, Y, WIDTH, HEIGHT);
}
public void keyReleased(KeyEvent e) {
xa = 0;
}
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_LEFT)
xa = -1;
if (e.getKeyCode() == KeyEvent.VK_RIGHT)
xa = 1;
}
public Rectangle getBounds() {
return new Rectangle(x, Y, WIDTH, HEIGHT);
}
public int getTopY() {
return Y;
}
public void mouseDragged(MouseEvent m) {
xa = 0;
}
}
这是我的“游戏”课,我也试图实现球拍:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseWheelEvent;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.StringTokenizer;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
addMouseMotionListener(new MouseMotionListener() {
@Override
public void mouseDragged(MouseEvent m) {
racquet.mouseDragged(m);
}
@Override
public void mouseMoved(MouseEvent arg0) {
}
答案 0 :(得分:2)
基本理念是......
mousePressed
事件时,您需要确定事件是否发生在Racquet
中。 Rectangle
有一个简洁的contains
方法,可以做到这一点(这被称为“命中检测”)Racquet
的原点之间的差异(即,它当前的x / y点)Racquet
事件时,您需要确定是否实际拖动mouseDragged
,如果是,则需要计算鼠标点与原始点击“偏移”之间的差异,这为您提供了Racquet
Racquet
事件时,您需要将mouseReleased
标记为未被拖动,以便将来拖动事件“意外”导致Racquet
被移动也许像......
Racquet
附注:我正在使用不完整的图片,并将解决方案基于类似问题的其他示例。如果您需要更多信息,则需要提供Minimal, Complete, and Verifiable example以便为问题提供更多背景信息。
但是,我建议阅读:
以更好地了解鼠标侦听器API的工作原理