2009-03-15 2 views
3

В основном я пытаюсь использовать этот класс 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) не поддерживаются. Однако, независимо от того, сколько способов я их конвертирую, они все равно не работают.

Было бы очень полезно, если кто-то может любезно просветить меня, что может быть неправильным, и как я могу это разрешить.

Образец кода и любые изменения, которые вы можете предложить, чтобы помочь сделать этот код работы, будут весьма полезны.

спасибо.

ответ

5

Вашей первопричина Исключение составляет

javax.sound.sampled.LineUnavailableException: 
line with format ALAW 8000.0 Hz, 8 bit, stereo, 2 bytes/frame, not supported 

Это происходит потому, что не все звуковые драйвера поддерживают все битрейты или кодировки, или потому что машина просто не имеет звуковую карты. Звук может быть закодирован в A law или mu law (или другими, например MP3) и может быть закодирован с разной скоростью передачи данных и размерами выборки. Java не всегда поддерживает все возможные звуковые форматы, в зависимости от того, что поддерживается базовой системой.

Вы, вероятно, хотите сделать следующее:

  • Убедитесь, что компьютер, на котором выполняется программа имеет разумную звуковую карту. В большинстве случаев, когда я вижу вышеупомянутое исключение, я запускаю серверную машину без встроенной звуковой карты или с очень хромой звуковой картой или без аудиодорожки.
  • Если вы используете удаленный терминал или что-то вроде этого, убедитесь, что звук имеет настроенный способ воспроизведения.
  • Попробуйте перекодировать ваш образец звука с другой скоростью или, возможно, в качестве файла WAV, а затем попробуйте воспроизвести его.
Смежные вопросы