Java 2D 游戏 - MouseClicked 和 MouseMoved 方法
Java 2D Game - MouseClicked & MouseMoved methods
问题
我有两个 MouseEvent 处理程序(mouseClicked 和 mouseMoved),它们都可以工作,但只能单独工作。
如果我单击鼠标,动作会得到很好的处理。 (子弹被发射)
如果我移动鼠标,动作就会得到很好的处理。 (精灵移动)
当我同时执行这两个操作(单击时移动鼠标)时出现问题。 mouseMoved 事件运行良好,但 mouseClicked 事件未被调用。
下面的代码在我的 Game class 构造函数中,它扩展了 JPanel。
this.addMouseListener(new MouseAdapter(){
@Override
public void mouseClicked(MouseEvent e){
//This creates a new bullet, and adds to an array to get drawn.
bullet = new Bullet(105, e.getY()+5, bulletTexture);
bulletsOnScreen.add(bullet);
e.consume();
}
});
this.addMouseMotionListener(new MouseAdapter(){
@Override
public void mouseMoved(MouseEvent e){
//This increments the sprites position on the screen.
player.setYPosition(e.getY()-50);
e.consume();
};
});
我试过的
我尝试使用 SwingWorker 对象 运行 在后台线程中移动 mouseMoved,但结果是一样的(子弹没有发射)。
@Override
public void mouseMoved(MouseEvent e){
SwingWorker myWorker = new SwingWorker<Void, Void>(){
@Override
protected Void doInBackground() throws Exception {
player.setYPosition(e.getY()-50);
e.consume();
return null;
}
};
myWorker.execute();
};
我也曾尝试在 mouseMoved 方法中检查 mouseClick,但仍然没有成功。
public void mouseMoved(MouseEvent e){
if(e.getButton() == MouseEvent.MOUSE_CLICKED){
//Create bullet and add to array (but this never gets called)
}
player.setYPosition(e.getY()-50);
e.consume();
};
如果有人有任何想法或指点,那将是非常感谢。
这是我编写的一些代码,其中包含您描述的行为的完整工作示例。
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class Main {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
System.out.println("Pressed");
}
@Override
public void mouseClicked(MouseEvent e) {
System.exit(1);
}
});
frame.addMouseMotionListener(new MouseAdapter() {
@Override
public void mouseMoved(MouseEvent e) {
System.out.println("Moved");
}
});
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(100, 100);
frame.setVisible(true);
}
});
}
}
正如您在框架中移动时所看到的那样,您会得到很多 "Moved"
事件。
对你来说最有趣的部分是当你按下鼠标按钮时你会看到 "Pressed"
。如果你释放而不移动会有点击事件(应用程序将退出)。关闭应用程序可能有点极端,但我们必须确保不会错过该事件。
但是当你按下鼠标按钮,按住它并移动时,你不会看到任何移动事件被触发。然后,当您释放时,您也不会触发点击事件。
我不确定这部分,但看起来 mouseClicked
只有在 mousePressed
和 mouseReleased
事件发生时才会被触发一个接一个。
在您的游戏中,当您同时单击和移动鼠标时,基本上就是
mousePressed -> mouseMoved -> mouseReleased
但这并没有触发 mouseClicked
。
我的建议是您处理 mousePressed
而不是 mouseClicked
或尝试根据您的需要调整 MouseAdapter#mouseDragged
方法。
问题
我有两个 MouseEvent 处理程序(mouseClicked 和 mouseMoved),它们都可以工作,但只能单独工作。
如果我单击鼠标,动作会得到很好的处理。 (子弹被发射)
如果我移动鼠标,动作就会得到很好的处理。 (精灵移动)
当我同时执行这两个操作(单击时移动鼠标)时出现问题。 mouseMoved 事件运行良好,但 mouseClicked 事件未被调用。
下面的代码在我的 Game class 构造函数中,它扩展了 JPanel。
this.addMouseListener(new MouseAdapter(){
@Override
public void mouseClicked(MouseEvent e){
//This creates a new bullet, and adds to an array to get drawn.
bullet = new Bullet(105, e.getY()+5, bulletTexture);
bulletsOnScreen.add(bullet);
e.consume();
}
});
this.addMouseMotionListener(new MouseAdapter(){
@Override
public void mouseMoved(MouseEvent e){
//This increments the sprites position on the screen.
player.setYPosition(e.getY()-50);
e.consume();
};
});
我试过的
我尝试使用 SwingWorker 对象 运行 在后台线程中移动 mouseMoved,但结果是一样的(子弹没有发射)。
@Override
public void mouseMoved(MouseEvent e){
SwingWorker myWorker = new SwingWorker<Void, Void>(){
@Override
protected Void doInBackground() throws Exception {
player.setYPosition(e.getY()-50);
e.consume();
return null;
}
};
myWorker.execute();
};
我也曾尝试在 mouseMoved 方法中检查 mouseClick,但仍然没有成功。
public void mouseMoved(MouseEvent e){
if(e.getButton() == MouseEvent.MOUSE_CLICKED){
//Create bullet and add to array (but this never gets called)
}
player.setYPosition(e.getY()-50);
e.consume();
};
如果有人有任何想法或指点,那将是非常感谢。
这是我编写的一些代码,其中包含您描述的行为的完整工作示例。
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class Main {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
System.out.println("Pressed");
}
@Override
public void mouseClicked(MouseEvent e) {
System.exit(1);
}
});
frame.addMouseMotionListener(new MouseAdapter() {
@Override
public void mouseMoved(MouseEvent e) {
System.out.println("Moved");
}
});
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(100, 100);
frame.setVisible(true);
}
});
}
}
正如您在框架中移动时所看到的那样,您会得到很多 "Moved"
事件。
对你来说最有趣的部分是当你按下鼠标按钮时你会看到 "Pressed"
。如果你释放而不移动会有点击事件(应用程序将退出)。关闭应用程序可能有点极端,但我们必须确保不会错过该事件。
但是当你按下鼠标按钮,按住它并移动时,你不会看到任何移动事件被触发。然后,当您释放时,您也不会触发点击事件。
我不确定这部分,但看起来 mouseClicked
只有在 mousePressed
和 mouseReleased
事件发生时才会被触发一个接一个。
在您的游戏中,当您同时单击和移动鼠标时,基本上就是
mousePressed -> mouseMoved -> mouseReleased
但这并没有触发 mouseClicked
。
我的建议是您处理 mousePressed
而不是 mouseClicked
或尝试根据您的需要调整 MouseAdapter#mouseDragged
方法。