Звуковые эффекты Java-игры не работают правильно

Я пытаюсь сделать свой школьный проект (простая игра на Java) и не могу заставить работать звуковые эффекты. Я делаю это с помощью Clip, и теперь мой playSound-метод выглядит так:

public void playSound(File filename) {
    try {
        AudioInputStream sound = AudioSystem.getAudioInputStream(filename);
        Clip clip = AudioSystem.getClip();
        clip.open(sound);

        clip.setFramePosition(0);
        clip.start();
    } 
    catch (UnsupportedAudioFileException ex) {
        ex.printStackTrace();
    } 
    catch (IOException ex) {
        ex.printStackTrace();
    } 
    catch (LineUnavailableException ex) {
        ex.printStackTrace();
    }
}

У меня разные звуковые эффекты в качестве атрибутов (файлов), и я вызываю этот метод, когда хочу воспроизвести звук.

Все работает нормально: звук воспроизводится, например, когда игрок ест что-то, но иногда звуки выходят из строя. Звук еды звучит, пока игрок ничего не ест.

Вы знаете, что не так? Проблематично ли воспроизвести несколько звуковых эффектов, подобных этому? Спасибо!:)

1 ответ

Следующий совет может или не может помочь в вашей ситуации.

Вы загружаете клипы с диска каждый раз, когда воспроизводите звук. Клипы были разработаны для однократной загрузки и вызывались по мере необходимости. Чтобы воспроизвести клип, вы сбрасываете его обратно на 0-ю миллисекунду или кадр, а затем вызываете play, как здесь. Таким образом, это начинается очень быстро. Как вы его запрограммировали, клип даже не начнет воспроизводиться, пока он полностью не загрузится с диска в память, а setFramePosition(0) будет излишним, так как вновь созданный клип будет воспроизводиться с самого начала (если вы явно не установили явно это в какую-то другую позицию кадра).

Итак, я рекомендую в начале игры загружать клипы один раз в объекты, которые будут сохраняться, и ссылаться на них по мере необходимости, тогда вам нужно только вызвать методы setFramePosition(0) и play(),

Если звуки воспроизводятся в нечетное время, я бы более внимательно посмотрел на логику, которая вызывает звуки. Хотя ваш метод не является оптимальным, он работает и приводит к странно позднему времени воспроизведения, если загрузка звукового файла по той или иной причине была отложена. Но если ваш звук длится более нескольких секунд, причиной задержки могут быть эти задержки загрузки.

Еще одна мысль, SourceDataLine начнет играть быстрее, чем создание, загрузка и воспроизведение нового клипа. Для воспроизведения SDL требуется немного больше процессора, чем для клипа, но это все же разумный путь, если звуковые файлы находятся на длинной стороне.

Другие вопросы по тегам