3

取り組んでいるゲームにサウンドを追加しようとしていますが、サウンドを複数回再生するのに問題があります。原因は解決したと思いますが、解決方法がわかりません。Javaサウンドチュートリアルを検索中に見つけた列挙子を使用しています。

問題は、スレッド内の update() メソッドでサウンドを呼び出していることと、サウンドの play() メソッドを呼び出すたびに、クリップが最初からやり直されることです。初めて呼び出されたとき、サウンドは正常に再生されますが (少しフリーズする場合があります)、その後のサウンド再生の試みはすべて失敗します。例外やエラーは発生しません。サウンドが再生されません。

public enum Sounds {
    RIFLE("rifle_fire.wav");

    private Clip clip;

    Sounds(String filename) {
        openClip(filename);
    }

    public synchronized void openClip(String filename) {
        try {
            URL audioFile = Sounds.class.getResource("/resources/sounds/" + filename);

            AudioInputStream audio = AudioSystem.getAudioInputStream(audioFile);
            AudioFormat format = audio.getFormat();
            DataLine.Info info = new DataLine.Info(Clip.class, format);
            clip = (Clip) AudioSystem.getLine(info);

            clip.open(audio);
        } catch (UnsupportedAudioFileException uae) {
            System.out.println(uae);
        } catch (IOException ioe) {
            System.out.println(ioe);
        } catch (LineUnavailableException lue) {
            System.out.println(lue);
        }
    }

    public synchronized void play() {
        if(clip.isRunning()) clip.stop();
        clip.setFramePosition(0);
        clip.start();
    }

    public static void init() {
        values();
    }
}

それが私が使用する列挙子です。これは、20 ミリ秒ごとに更新されるメイン スレッドの update() メソッドから呼び出されます。update メソッドでは、このように呼び出します。

// If the left mouse button is held down, create a new projectile.
if(Globals.buttons[0] && !player.isOnCooldown()) {
    createParticle(pAngle);
    Sounds.RIFLE.play();
}

使用後に回線を閉じる必要があると誰かが提案しましたが、サウンドは一度しか開かれません...なぜ閉じる必要があるのですか? 誰が問題が何であるか知っていますか?

4

0 に答える 0