Как использовать звуковые эффекты в Java 8?Змея ест яблоко - PullRequest
0 голосов
/ 25 декабря 2018

Я написал код Snake и хочу добавить звуковой эффект, когда змея ест яблоко.Я скопировал код от какого-то парня на YT, но он не работает для меня.Может кто-нибудь объяснить мне, как это сделать?

Код:

import com.sun.tools.javac.Main;

import javax.sound.sampled.*;
import java.io.IOException;
import java.net.URL;

public class AppleEatSoundEffect {
    public static Mixer mixer;
    public static Clip clip;

    public static void main(String[] args) {
        Mixer.Info[] mixInfos = AudioSystem.getMixerInfo();
        mixer = AudioSystem.getMixer(mixInfos[0]);

        DataLine.Info dataInfo = new DataLine.Info(Clip.class, null);
        try {
            clip = (Clip) mixer.getLine(dataInfo);
        } catch (LineUnavailableException lue) {
            lue.printStackTrace();
        }

        try {
            URL soundURL = Main.class.getResource("NotBad.wav");
            AudioInputStream audioStream = AudioSystem.getAudioInputStream(soundURL);
            clip.open(audioStream);
        } catch (LineUnavailableException lue) {
            lue.printStackTrace();
        } catch (UnsupportedAudioFileException uafe) {
            uafe.printStackTrace();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }

            clip.start();
            do {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException ie) {
                    ie.printStackTrace();
                }
            } while (clip.isActive());
        }
    }

Компилятор говорит, что что-то не так с clip = (Clip) mixer.getLine(dataInfo);:

Исключение в потоке "main"java.lang.IllegalArgumentException: строка не поддерживается: интерфейс Clip на java.desktop / com.sun.media.sound.PortMixer.getLine (PortMixer.java:131)

1 Ответ

0 голосов
/ 26 декабря 2018

Ниже приведен метод, позволяющий воспроизводить аудиофайлы, в частности обычные файлы WAV или MIDI.Попробуйте ... если вы получите желаемый звук, дайте мне знать.

public Thread playWav(final File wavFile, final boolean... loopContinuous) {
    String ls = System.lineSeparator();
    // Was a file object supplied?
    if (wavFile == null) {
        throw new IllegalArgumentException(ls + "playWav() Method Error! "
                + "Sound file object can not be null!" + ls);
    }

    // Does the file exist?
    if (!wavFile.exists()) {
        throw new IllegalArgumentException(ls + "playWav() Method Error! "
                + "The sound file specified below can not be found!" + ls
                + "(" + wavFile.getAbsolutePath() + ")" + ls);
    }

    // Play the Wav file from its own Thread.
    Thread t = null;
    try {
        t = new Thread("Audio Thread") {
            @Override
            public void run() {
                try {
                    Clip clip = (Clip) AudioSystem.getLine(new Line.Info(Clip.class));
                    audioClip = clip;
                    clip.addLineListener((LineEvent event) -> {
                        if (event.getType() == LineEvent.Type.STOP) {
                            clip.drain();
                            clip.flush();
                            clip.close();
                        }
                    });
                    clip.open(AudioSystem.getAudioInputStream(wavFile));
                    // Are we to loop the audio?
                    if (loopContinuous.length > 0 && loopContinuous[0]) {
                        clip.loop(Clip.LOOP_CONTINUOUSLY);
                    }
                    clip.start();
                }
                catch (LineUnavailableException | UnsupportedAudioFileException | IOException ex) {
                    ex.printStackTrace();
                }
            }
        };
        t.start();
        Thread.sleep(100);
    }
    catch (InterruptedException e) {
        e.printStackTrace();
    }
    return t;
}

Чтобы использовать этот метод, просто вызывайте его везде и всегда, когда вы хотите воспроизвести определенный звуковой эффект:

File file = new File("resources/NotBad.wav");
playWav(file);

Убедитесь, что объект файла указывает на правильное местоположение файла.Если вы хотите зациклить аудиофайл, как, например, для фоновой музыки игры, укажите логическое значение true для необязательного параметра loopContinuous :

File file = new File("resources/BackgroundMusic.mid");
playWav(file, true);
...