我正在关注这个[稍微老一点的2d java游戏教程] [1]。
我有一个基本的applet,它在一个带有mouselistener的线程中运行。
在左键单击时,我可以从窗口底部拍摄最多10个claypigeons(球)。在右键单击我“射击”,如果我击中一只鸽子,它将从屏幕上移除。
但是我注意到有时候右键点击不会被提起。这不一定是屏幕上有很多事情发生的,尽管从一开始就没有开始。在最坏的情况下,在注册之前可能需要3或4次点击。
我猜我在代码中做了一些明显错误的事情,但我不确定是什么。我的第一个想法是for循环遍历每个对象的每一帧重新计算他们的位置或检查他们是否已被“射击”?他们可能会“阻挡”mouselistener吗?!
欢迎任何有关如何调试此功能的提示!
的 的 ** * ** * ** * 的 修改的 * ** * ** * ** * < / EM> *
好的,我已经采取了下面给出的非常好的建议,并将代码缩减为最小的简单再现错误。我想我脑子里已经知道所有for循环和导致问题的复杂性,这就是为什么我在第一段代码中包含了这么多。
因此,我几乎没有代码可以重现这个错误,但同时它的bug也更温和。使用下面的代码,我只需要基本的applet和mouselistener,然后右键单击控制台中的计数增量并将其值输出到屏幕。这在大多数情况下都可以正常工作,但是不时地,右键单击“丢失”而未注册。
使用完整的课程,我有时可以获得3或4个或更多右键单击的序列,因此错误更加明显。无论如何代码如下,这次只有一个类:
主类代码:
package javacooperation;
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.net.*;
public class ClayPigeonGame extends Applet implements Runnable, MouseListener {
//counters and flags for debugging
private boolean flag = true;
private int click_count = 0;
private boolean game_running;
public void init(){
//set boolean for while loop
game_running=true;
addMouseListener(this);
}
public void start() {
//threading this applet.. why?
Thread th = new Thread(this);
//does this call the run method in the class?
th.start();
}
public void stop(){
game_running=false;
}
public void destroy() { }
public void run(){
while(game_running) {
//updatePigeonPosition();
repaint();
try{
//stop thread for 20 milliseconds
Thread.sleep(20);
} catch (InterruptedException ex){ }
}
}
public void paint(Graphics g){ }
public void mouseClicked(MouseEvent e) {
switch (e.getButton()){
case MouseEvent.BUTTON1:
case MouseEvent.BUTTON2:
break;
case MouseEvent.BUTTON3:
click_count ++;
System.out.println("Right click count: " + click_count);
break;
default:
break;
}
}
//all the mouse listening events required because we implemented MouseListener
public void mouseReleased(MouseEvent e) { }
public void mouseEntered(MouseEvent e) { }
public void mousePressed(MouseEvent e) { }
public void mouseExited(MouseEvent e) { }
}
答案 0 :(得分:2)
我猜你的代码可能会干扰鼠标点击的检测时间,因为点击实际上既是按下又是正确边界的释放等等。您是否尝试过不使用点击后的回叫而是使用按下的(将代码移到mousePressed
代替?)