0

ゲームを作成するために、Javaで実行しようとしているスレッドがあります。スレッドは本質的に少しの間スリープし、オブジェクトを更新してから repaint() を呼び出します。インターネットで見つけたコードのように見えますが、うまくいきません。

コードは次のとおりです。

@Override
public void run() {
    int sleep = 500;
    Dimension dim = getSize();
    while(true){
        try {
            Thread.sleep(sleep);
            System.out.println("Sleeping!");
        } catch (InterruptedException e) {
            System.out.println("interrupted");
        }
        for(int i = 0 ; i < poop.size() ; i++){
            poop.get(i).update(dim.width, dim.height);
            System.out.println("Y is: "+poop.get(i).getYCoord()+" Step is: "+poop.get(i).getYStep());
        }
        repaint();
        }
}

問題は、try catch ブロックを for ループに入れると発生します。これは正常に呼び出され、System.out は Y 座標も出力しますが、更新はもう機能しません。どんなアイデアも素晴らしいでしょう。さらにコードが必要な場合は、教えてください。更新コードもここに置きます。また、多かれ少なかれスレッドの初心者のように私を扱ってください。また、私が使用しているスイングライブラリの多かれ少なかれ初心者でもあります。

update() コードは次のとおりです。

@Override public void update(int screenWidth, int screenHeight)
{
    xCoord += xStep;
    if (xCoord > screenWidth) {
        xCoord = 0;
    } else if (xCoord < 0) {
        xCoord = screenWidth;
    }

    yCoord += yStep;
    if (yCoord > screenHeight) {
        yCoord = 0;
    } else if (yCoord < 0) {
        yCoord = screenHeight;
    }
}
4

3 に答える 3

0

repaint()forループが完全に終了するまで、呼び出しは行われません。したがって、スリープを内部に固定しても、500ミリ秒ごとに一度に1つのものが再描画されることはありません。ループを通過するsize() * 500だけで、すべてを一度に再ペイントする必要があります。

于 2012-12-03T05:31:13.537 に答える
0

ここでの問題は、Dimension dim = getSize();が何らかの理由で両方を 0 に設定していることです。したがって、 update メソッドはその仕事をすることができませんでした。

于 2012-12-03T06:06:57.573 に答える
0

このコードはrun()メソッド内にあり、おそらく Runnable オブジェクト内にありますが、記述はThread.sleep(...)Swing イベント スレッドで呼び出していることを示しています。これを行うと、スリープしているイベント スレッドが GUI の描画とユーザーとの対話を担当するため、GUI 全体がスリープ状態になります。

解決策: そうしないでください。SwingWorker などのバックグラウンド スレッドで実行時間の長いタスクやスリープを実行します。

または、 を削除してThread.sleep(...)、代わりにスイング タイマーを使用します。

于 2012-12-03T05:10:12.177 に答える