1

上記のモードの2Dゾンビシューターを作成していますが、スレッドに問題があります。これが取引です。スペースを押すたびにキャラクターに弾丸を発射させました。問題は、スペースを確保すると、1発発射してから一時停止してから、大量の弾丸を発射することでした。これを修正する方法はたくさんありましたが、撮影速度を将来変更する余地があるので、この方法が必要です。問題を引き起こしているスレッドのコードは次のとおりです。

package threads;

import Game.GameCore;

public class Shoot extends GameCore implements Runnable {

/**
 * WHEN I START THIS THREAD, THE ENTIRE GAME FREEZES, AND I DO NOT KNOW
 * WHY... NEED TO FIX. IT DOES NOT FIX THE PROBLEM TO TAKE OUT THE "SHOOT"
 * OR THE "SLEEP"...
 */

public void run() {
    while (shooting && gameRunning) { // shooting is made true when space is
                                        // pressed, and set false when space
                                        // is released. gameRunning is true
                                        // if the game is running, which it
                                        // is. removing either of these
                                        // doesnt work either.
        player.shoot(); // player comes from the GameCore class, and
                        // represents the player entity. if i remove this,
                        // nothing changes.

        try {
            Thread.sleep(bulletShootSpeedMillis); // bulletShootSpeedMillis
                                                    // is equal to 1000, but
                                                    // makes no difference
                                                    // to change
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

}

だからここにダンの問題があります。コメントはちょっとそれらを指摘しますが、それらをリストしません。whileループ内の、またはその1つなど、明らかなものを削除しても、何も変わりませplayer.shoot();ん。Thread.sleep(bulletShootSpeedMillis);問題は、スレッドを初期化するときに、

else if (key == Integer.parseInt(commands[6])) {
        shooting = true;
        new Thread(new Shoot()).run();
    }

ゲーム全体がフリーズします。何も起こりません。スペースでスレッドを開始した瞬間、ゲームがフリーズし、理由がわかりません!!! 以前のバージョン:

else if (key == Integer.parseInt(commands[6])) {
                    player.shoot();
            }

それはうまく機能します。助けてください!前もって感謝します!:)

編集:迅速な回答に感謝します。言うまでもなく、単純な間違いを伴う主要な学習経験XD

4

1 に答える 1

8

Ayyyy!

new Thread(new Shoot()).run(); // ***** !!!!

run()メソッドを呼び出してスレッドを開始するのではありません。これは、呼び出し元のコードと同じスレッドでコードを呼び出すだけだからです。そのメソッドを呼び出すことにより、新しいスレッドを開始します。start()

于 2013-02-19T03:37:42.803 に答える