2

だから私はプレイヤーに対してリバーシ/オセロをプレイするプログラムを書いています。ピースがひっくり返る短いアニメーションを作成する方法を書きました-

public void flip(int row, int col, Graphics window)
{
Color a;
if (pieces[row][col]==1)
    a = Color.black;
else
    a = Color.white;
for ( int size = 90; size>0; size-=2)
{
    try { Thread.sleep(11,1111); } catch (InterruptedException exc){}
    window.setColor(new Color( 0, 100, 0 ));
    window.fillRect(row*100+3, col*100+3, 94, 94);
    window.setColor(a);
    window.fillOval(row*100 + 5, col*100+5+(90-size)/2, 90, size);
}
if (a==Color.black)
    a=Color.white;
else
    a=Color.black;
for ( int size = 0; size<90; size+=2)
{
    try { Thread.sleep(11,1111); } catch (InterruptedException exc){}
    window.setColor(new Color( 0, 100, 0 ));
    window.fillRect(row*100+3, col*100+3, 94, 94);
    window.setColor(a);
    window.fillOval(row*100 + 5, col*100+5+(90-size)/2, 90, size);
}
}

問題は、thread.sleep がプログラム全体を一時停止するため、一度に 1 つの部分しか反転できないことです。プログラムの残りの部分を中断することなく、そのメソッドだけを一時停止するためにできることはありますか?

みんな、ありがとう。新しいスレッドは機能しましたが、今は別の問題があります。Flip メソッドの 3 つの setcolor メソッドが混同されています。色を緑に設定しているスレッド、黒に設定しているスレッド、白に設定しているスレッドがあるためだと思います。これを修正するにはどうすればよいですか?

4

4 に答える 4

7

メイン プログラムから作成された専用スレッド内でこのメソッドを実行する必要があります。

于 2013-01-16T20:03:40.553 に答える
3

ターゲットとしているのは非同期プログラミングです。javax.swing.Timer起動するたびに 1 つのアニメーション ステップを実行する a をスケジュールします。これは、GUI プログラムの慣用的な方法です。ループでスリープし、invokeLater各ステップで使用する別のスレッドを使用するアプローチも機能しますが、より多くのシステム リソース (ほとんどスリープする別のスレッド) を使用するため、あまり洗練されていません。

于 2013-01-16T20:07:47.230 に答える
3

その場合flipは別々に実行する必要があります。Thread最も簡単な例:

Thread t = new Thread(new Runnable() {
    public void run() {
        flip();
    }
});
t.start();
于 2013-01-16T20:07:01.373 に答える
1

アニメーションを処理する別のスレッドを作成する必要があります。「プログラム全体」を一時停止するのではなく、現在のスレッドのみを一時停止するThread#sleepため、そのスレッドは を呼び出すことができます。Thread#sleepアニメーションの各ステップで、駒フリップ アニメーションの現在の段階を示す状態を変更し、再描画を要求する必要があります。

于 2013-01-16T20:07:23.110 に答える