3

私はこれをフォローしています[2DJavaゲームの少し古いチュートリアルはこちら][1]。

マウスリスナーを使用してスレッドで実行される基本的なアプレットがあります。

左ボタンをクリックすると、ウィンドウの下部から最大10個のクレイピジョン(ボール)を発射できます。右ボタンをクリックして「撃ちます」。鳩に当たると画面から削除されます。

ただし、右クリックが検出されない場合があることに気づきました。これは必ずしも画面上で多くのことが起こっているときではありませんが、すべてが始まる前に最初は決してありません。最悪の場合、登録されるまでに3〜4回のクリックが必要になる場合があります。

コードで明らかに間違ったことをしていると思いますが、何が起こっているのかわかりません。私の最初の考えは、フレームごとにすべてのオブジェクトをループして、それらの位置を再計算したり、「ショット」されたかどうかを確認したりするforループでしたか?彼らはマウスリスナーを「ブロック」しているのでしょうか?!

これをデバッグする方法に関するヒントは大歓迎です!

** * ** ****編集**** ** * ** * * _ _ _ _

わかりました、私は以下に与えられた非常に良いアドバイスを取り、バグを再現する最小の簡単にコードを減らしました。問題を引き起こしているのはすべてのforループと複雑さであることが頭に浮かんだと思います。そのため、最初のコードに多くを含めました。

そのため、たまたまこのバグをほとんどコードなしで再現できますが、同時にバグははるかに軽度です。以下のコードでは、基本的なアプレットとマウスリスナーがあり、右クリックするとコンソールでカウントが増加し、その値が画面に出力されます。これはほとんどの場合正常に機能しますが、右クリックが「失われ」、登録されない場合があります。

フルクラスでは、3回または4回以上の右クリックのシーケンスが登録されないことがあるため、バグははるかに明白でした。とにかくコードは以下のとおりですが、今回は1つのクラスのみです。

メインクラスコード:

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 に答える