0

これまでのところ、私はこのアプレットを実用的な段階にまで進めました。唯一の問題は、マウスが動いている場合にのみ機能することです。マウスを動かさないと、すべてが停止します。マウスを動かすと、再び機能し始めます。

それが機能する方法は、ペイント メソッドが mouseMoved メソッドによって呼び出されることです。マウスを動かすたびに、ペイント メソッドがスローされ、ゲームが続行されます。問題は、mouseMoved メソッドが呼び出されない場合に発生するため、paint メソッドが呼び出されず、マウスが移動されるまで全体が一時停止します。

私は次のことを試しました:

paint メソッドを再帰的にすると、それ自体が呼び出されます。これに関する問題は、マウスリスナーが機能しないことです。これは、プログラムが動き回るたくさんのものをペイントするのに忙しいためです。

また、マウスリスナーがペイント メソッドを中断するように、スレッドを使用してみました。これは機能しませんでしたが、スレッドがどのように機能するかを理解していないことが原因である可能性があります。誰かがこれを実装する方法を知っていれば、うまくいくようです。

問題のある部分のコードの抜粋です。

  public void paint( Graphics gr) {
     if( Earth != null){

        displayWorld(Earth);
        for(int a =0; a < 100; a++){      
           Earth.run();
           Earth.Worlds.get(2).forceMove(x,y);
          }
        try
        {
           Thread.sleep(100);  
        }
           catch (InterruptedException ie)
           {}   
     }

  }

public void mouseMoved( MouseEvent e ) {
     x = e.getX();
     y = e.getY();
     Graphics gr = getGraphics();      
    paint(gr);
  }  
4

2 に答える 2

2

スレッドをもう一度見てみることをお勧めします。これは、ゲーム プログラミング (およびプログラミングの他の分野でも) では非常に標準的な問題です。ゲーム ロジックを含む 1 つのスレッドが永遠にループします。プレーヤーの位置を更新したり、計算したり、健康状態などを更新したり、やるべきことがなければスリープしたりします。アプレットのグラフィックスの再描画が必要な作業が完了すると、スレッドはrepaint()再描画要求をイベント ディスパッチ スレッド (すべての Java プログラムで自動的に作成される特別なスレッド) に送信する呼び出しを行います。

プレーヤーがマウスを動かしたり、キーボード入力を提供したりすると、イベント リスナーがプログラムのデータ構造を更新します (メイン スレッドがスリープしている場合は、そのスレッドを呼び出します)。

Java ゲームに関する以前の StackOverflow の質問へのこれらのリンクは、良い出発点になる可能性があります。

UI スレッドをフリーズせずにゲーム ループを実装する最良の方法

ゲームループ - スレッド

幸運を!

于 2012-08-23T03:29:57.330 に答える
1

それで、あなたのペイントプロセスはマウスの動きに依存していますか?? では、アプレットに自分自身を更新するように指示する何らかの方法が必要ですか??

private javax.swing.Timer paintTimer;

public void start() {
    // Your normal setup...

    paintTimer = new javax.swing.Timer(250, new ActionListener() {
        public void actionPerformed(ActionEvent evt) {
            Graphics gr = getGraphics();      
            paint(gr);
        }
    });
    paintTimer.setRepeats(true);
    paintTimer.setCoalesce(true);
    paintTimer.start();
}

public void mouseMoved( MouseEvent e ) {
    x = e.getX();
    y = e.getY();

    // You could wait for the timer to trigger the repaint for you...
    repaintTimer.restart();

    Graphics gr = getGraphics();      
    paint(gr);
}  

ただし、タイミングをいじる必要があります

于 2012-08-23T03:17:51.413 に答える