В основном я пытаюсь использовать этот класс SoundEffect в простой java-игре, над которой я работаю для своего задания.Использование звуковых эффектов в java-игре
import java.io.*;
import java.net.URL;
import javax.sound.sampled.*;
/**
* This enum encapsulates all the sound effects of a game, so as to separate the sound playing
* codes from the game codes.
* 1. Define all your sound effect names and the associated wave file.
* 2. To play a specific sound, simply invoke SoundEffect.SOUND_NAME.play().
* 3. You might optionally invoke the static method SoundEffect.init() to pre-load all the
* sound files, so that the play is not paused while loading the file for the first time.
* 4. You can use the static variable SoundEffect.volume to mute the sound.
*/
public enum SoundEffect {
EAT("eat.wav"), // explosion
GONG("gong.wav"), // gong
SHOOT("shoot.wav"); // bullet
// Nested class for specifying volume
public static enum Volume {
MUTE, LOW, MEDIUM, HIGH
}
public static Volume volume = Volume.LOW;
// Each sound effect has its own clip, loaded with its own sound file.
private Clip clip;
// Constructor to construct each element of the enum with its own sound file.
SoundEffect(String soundFileName) {
try {
// Use URL (instead of File) to read from disk and JAR.
URL url = this.getClass().getClassLoader().getResource(soundFileName);
// Set up an audio input stream piped from the sound file.
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(url);
// Get a clip resource.
clip = AudioSystem.getClip();
// Open audio clip and load samples from the audio input stream.
clip.open(audioInputStream);
} catch (UnsupportedAudioFileException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (LineUnavailableException e) {
e.printStackTrace();
}
}
// Play or Re-play the sound effect from the beginning, by rewinding.
public void play() {
if (volume != Volume.MUTE) {
if (clip.isRunning())
clip.stop(); // Stop the player if it is still running
clip.setFramePosition(0); // rewind to the beginning
clip.start(); // Start playing
}
}
// Optional static method to pre-load all the sound files.
static void init() {
values(); // calls the constructor for all the elements
}
}
Вот реализация EAT звука в награду моей игры class-
public void react(CollisionEvent e)
{
Player player = game.getPlayer();
if (e.contact.involves(player)) {
player.changePlayerImageEAT();
SoundEffect.EAT.play();
player.addPoint();
System.out.println("Player now has: "+player.getPoints()+ " points.");
game.getCurrentLevel().getWorld().remove(this);
}
}
Это должно играть EAT звук, когда игрок приходит в контакт с наградой в моей игре.
Однако, когда мой игрок сталкивается с наградой, я получаю следующие ошибки в terminal-
javax.sound.sampled.LineUnavailableException: линия с форматом ALAW 8000.0 Гц, 8 бит, стерео , 2 байта/кадра, а не . в com.sun.media.sound.DirectAudioDevice $ DirectDL.implOpen (DirectAudioDevice.java:494) в com.sun.media.sound.DirectAudioDevice $ DirectClip.implOpen (DirectAudioDevice.java:1280) в ком. sun.media.sound.AbstractDataLine.open (AbstractDataLine.java:107) на com.sun.media.sound.DirectAudioDevice $ DirectClip.open (DirectAudioDevice.java:1061) в com.sun.media.sound. DirectAudioDevice $ DirectClip.open (DirectAudioDevice.java:1151) на Soundeffect. (SoundEffect.java:39) на Soundeffect. (SoundEffect.java:15) в Reward.react (Reward.java:41) в city.soi.platform.World.despatchCollisionEvents (World.java:425) на city.soi.platform.World.step (World.java:608) на city.soi.platform.World.access $ 000 (World.java:42) на city.soi.platform.World $ 1.actionPerformed (World.java:756) в javax.swing.Timer.fireActionPerformed (Timer.java:271) на javax.swing. Таймер $ DoPostEvent.run (Timer.java:201) на java.awt.event.InvocationEvent.dispatch (InvocationEvent.java:209) на java.awt.EventQueue.dispatchEvent (EventQueue.java:597) в java.awt.EventDispatchThread.pumpOneEventForFilters (EventDispatchThread.java:269) на java.awt.EventDispatchThread.pumpEventsForFilter (EventDispatchThread.java:184) на java.awt.EventDispatchThread.pumpEventsForHierarchy (EventDispatchThread.java:174) на java.awt.EventDispatchThread.pumpEvents (EventDispatchThread.java:169) на java.awt.EventDispatchThread.pumpEvents (EventDispatchThread.java:161) на java.awt.EventDispatchThread.run (EventDispatchThread.java:122) Исключение из потока "AWT-EventQueue-0" java.lang.ExceptionInInitializerError at Reward.react (Reward.java:41) at city.soi.platform.World.despatchCollisionEvents (World.java:425) на city.soi.platform.World.step (World.java:608) на city.soi.platform.World.access $ 000 (World.java:42) at city.soi.platform.World $ 1.actionPerformed (World.java:756) at javax.swing.Timer.fireActionPerformed (Timer.Java: 271) на javax.swing.Timer $ DoPostEvent.run (Timer.java:201) в java.awt.event.InvocationEvent.dispatch (InvocationEvent.java:209) в java.awt.EventQueue .dispatchEvent (EventQueue.java:597) на java.awt.EventDispatchThread.pumpOneEventForFilters (EventDispatchThread.java:269) на java.awt.EventDispatchThread.pumpEventsForFilter (EventDispatchThread.java:184) на java.awt. EventDispatchThread.pumpEventsForHierarchy (EventDispatchThread.java:174) по адресу java.awt.EventDispatchThread.pumpEvents (EventDispatchThread.java:169) при java.awt.EventDispatchThread.pumpEvents (EventDispatchThread.java:161) на java.awt.EventDispatchThread.run (EventDispatchThread.java:122) вызвано следующими причинами: java.lang.NullPointerException на com.sun. media.sound.WaveFileReader.getAudioInputStream (WaveFileReader.java:180) на javax.sound.sampled.AudioSystem.getAudioInputStream (AudioSystem.java:1128) на SoundEffect. (SoundEffect.java:35) на SoundEffect. (SoundEffect.java:16) ... 15 еще
Я не могу понять, что случилось. Я предполагаю, что это связано с тем, что мои аудиофайлы (WAV) не поддерживаются. Однако, независимо от того, сколько способов я их конвертирую, они все равно не работают.
Было бы очень полезно, если кто-то может любезно просветить меня, что может быть неправильным, и как я могу это разрешить.
Образец кода и любые изменения, которые вы можете предложить, чтобы помочь сделать этот код работы, будут весьма полезны.
спасибо.