2014-01-29 2 views
0

게임용 사운드 코드 작업 중입니다. 그리고 난 다음 코드를 사용했다 :* .wav 파일은 디렉토리에서 어디에서 살 필요가 있습니까?

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 { 
    EXPLODE("explode.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 
    } 
} 

지금 나는 내 자신과 코드에서 나와 * .WAV 파일 중 하나를 교체 할 때, 심지어 위의 코드에서 나열된 파일 이름에 내 자신의 하나의 이름을 지정합니다. 널 읽을되지 않는 나에게 * .wav 파일 자체를 말하고있는의 것입니다 스택 URL URL을 다음에서

Exception in thread "main" java.lang.ExceptionInInitializerError 
    at soundTest.main(soundTest.java:19) 
Caused by: java.lang.NullPointerException 
    at com.sun.media.sound.StandardMidiFileReader.getSequence(Unknown Source) 
    at javax.sound.midi.MidiSystem.getSequence(Unknown Source) 
    at com.sun.media.sound.SoftMidiAudioFileReader.getAudioInputStream(Unknown Source) 
    at javax.sound.sampled.AudioSystem.getAudioInputStream(Unknown Source) 
    at SoundEffect.<init>(sfx.java:75) 
    at SoundEffect.<clinit>(sfx.java:55) 

: 나는 다음과 오류가 나타납니다.

다음 줄을 시도했지만 예. * .wav 파일이있었습니다 (동일한 이름의 세 항목을 가질 수 없다는 것을 알고 있습니다. 나는 그 중 하나를 사용하고, 주석을 달고 다시 시도해보십시오. src 폴더에 패키지 (기본값)와 디렉토리에있는 파일의 복사본을 배치,

TEST("file://C:/shoot.wav"); 
TEST("/soundTest/shoot.wav"); 
TEST("shoot.wav"); 

을뿐만 아니라 : 또 다른 하나는, 난 그냥가 "//"로 만들려면)이 읽기 쉽게 제거 물론 루트 (c :)에 있습니다.

나는 모든 표준 자바, 기본 코드 만에 여기서 열거 내 주요 문에 envoking하고 방법 : 정확히 * .wav 파일을 수행

SoundEffect.SHOOT.play(); 

그가 디렉토리 INT에 있어야합니다 ? 또는 다른 문제가 있다면 놓치기 때문에 지적하십시오. 또한 Windows 8.1에서 Eclipse IDE "Kepler"를 사용하고 있습니다. 나는 게시 된 코드가 내가 지금까지 가지고있는 것임을 주목하고 싶다.

+0

예제에 따라 파일을 기본 패키지에 저장해야합니다. 말하자면 Eclipse를 믿는다면 프로젝트 루트에 "resources"폴더를 만들고 Jar에 포함시킬 리소스를 배치해야합니다. – MadProgrammer

+0

@MadProgrammer 그래서이 문제가 잘못 되었다면 필자를 바로 잡아라, 나는 파일을 package_Name에 끌어서 놓을 수있다. 그런 다음 주석이 말하는 것처럼 그냥 호출한다? 나는 그와 같은 오류를 시도했기 때문에. – user3247187

+0

이클립스를 제대로 이해했다면 (프로젝트 사용자가 아님) 프로젝트의 최상위 레벨에 "resources"디렉토리를 만들어야합니다. 이 경우,'SoundEffect'의 패키지 구조와 같은 디렉토리 구조를 생성해야합니다. 그럼, 당신의 파일을 깨끗하고 빌드 ... 손가락을 넘어 – MadProgrammer

답변

1

Eclipse에 문제가있을 수 있다는 의견이 일부 있습니다. 나는 Eclipse가 문제라고 심각하게 의심한다. Eclipse를 사용하여 수백 개의 오디오 파일을로드했습니다. 일반적으로 파일을 호출 코드의 한 수준 아래에있는 "audio"하위 디렉토리에두고 "audio/mySound.wav"라는 상대 주소 양식을 사용합니다. 당신의 스택 추적에서 MIDI 참조가 왜

URL url = this.getClass().getResource("audio/" & fileName); 

나는 의아해 해요로에 : 여기

내가 내 URL을로드하는 방법입니다. MIDI는 .wav 파일을로드하는 것과 아무런 관련이 없으며 전혀 관련되어서는 안됩니다. 올바른 스택 추적이 확실합니까? 왜 우리는 MIDI에 대한 언급을보고 있습니까?

가끔 인식 할 수없는 .wav 파일 형식이 예기치 않은 오류를 발생시킵니다. 가장 일반적인 .wav는 16 비트 인코딩, 44100bps, 스테레오, 리틀 엔디안입니다. .wav 파일이이 형식입니까?

이 방식으로 구현되지 않은 코드의 일부 측면, 특히 ENUMS 사용이 있습니다. 나는 그 모든 것을 시험하고 입증 한 당신의 말씀을 받아 들일 것입니다. 필자는 개별 사운드 객체의 이름을 지정하고 (재생을 위해 Clip 또는 SourceDataLine과 함께 wav 파일의 래퍼 사용)이를 사용합니다. 당신이 가지고있는 것이 좋은 조직 도구 일 수도 있지만 의도 한대로 작동하는지 확실하지 않습니다.

예를 들어, SoundEffect.SHOOT.play() 에서처럼 SoundEffect를 정적으로 사용하는 경우 shoot.wav를 가리키는 지 확인하십시오. 이것을 확인하기위한 시험을 보았습니까? ENUMS와 정적 호출을 결합합니다. 따라하기가 다소 까다 롭습니다.

+0

답장을 보내 주셔서 감사합니다. 코드가 다른 그룹 구성원에게서 올랐다가 그가 올리고 떠났으므로, 코드를 사용하여 아무 것도 쓸모 없는지 알아 보았습니다. 내가 본 것보다 훨씬 간단 해 보이는 다른 "게임 오디오 코드"처럼 보입니다. 나는 당신의 URL 제안을 시도하고 내일 다시 당신과 함께. * .wav 파일을 확인하여 JAVA가 재생할 수있는 유효한 유형인지 확인합니다. – user3247187

+0

당신은 웃을 지 모르지만 실제로는 * .wav 파일이었고 자바에서는 지원되지 않았습니다. SMH 또한 코드에 더 많은 것이 있지만 오류없이 실행되지만 사운드를 출력하지는 않습니다. – user3247187

+0

때때로 나는 우는 것을 피하기 위해 웃는다. 나는이 문제로 처음으로 처음으로 좌절했고 짜증났다. 제 DAW는 32 비트 인코딩으로 .wav를 내보내는 것을 선호합니다. 자바 오디오를 처음 접했고 코드에 대한 이해가 안전하지 않았으므로이 작업을 이해하기가 어려웠습니다. 이 문제의 일부는 평범한 코드가 다른 오류 내에서 오류를 래핑하여 근본 원인을 찾기 어렵다는 것입니다. 즉, 발견 된 코드를 사용하는 중 하나의 버그가 있습니다. –