3

我正在关注这个[这里的 2d java 游戏稍微旧的教程][1]。

我有一个基本的小程序,它在一个带有鼠标监听器的线程中运行。

在左键单击时,我可以从窗口底部射击多达 10 个粘土鸽(球)。在右键单击我“射击”,如果我击中一只鸽子,它就会从屏幕上移除。

但是,我注意到有时右键单击没有被拾取。这不一定是当屏幕上有很多事情发生的时候,尽管在一切开始之前从来没有开始。在最坏的情况下,可能需要单击 3 或 4 次才能注册。

我猜我在代码中做了一些明显错误的事情,但我不确定是什么。我的第一个想法是每帧循环遍历每个对象以重新计算它们的位置或检查它们是否被“射击”的 for 循环?他们会“阻止”鼠标监听器吗?!

欢迎任何有关如何调试的提示!

** * ** * ** *编辑* ** * ** * ** * *

好的,我已经采纳了下面给出的非常好的建议,并将代码简化为重现错误的最小外壳。我想我的脑海里已经有了所有的 for 循环和导致问题的复杂性,这就是我在第一个代码中包含这么多内容的原因。

所以碰巧我可以用几乎没有代码来重现这个错误,但同时它的错误要温和得多。使用下面的代码,我只有基本的小程序和鼠标侦听器,右键单击控制台中的计数增量并将其值打印到屏幕上。这在大多数情况下都可以正常工作,但时不时地,右键单击会“丢失”并且未注册。

在整个课程中,有时我可能会出现 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) { }
}
4

1 回答 1

2

我猜你的代码可能会干扰鼠标点击检测时间,因为点击实际上既是按下又是具有正确边界的释放等。你是否尝试过不使用单击的回调,而是使用按下的(移动代码改为mousePressed)?

于 2012-05-06T17:21:40.750 回答