2013-05-03 1 views
0

나는 정말 이상한 방식으로 소리를 냈다. 반복 할 수있는 방법이있을 것이라고 생각 하는가? 사촌 한 번 재생 후 중지됩니다. , 게임 사운드의 재생 정지하기 때문에이 방법을 사용하여 사운드 루프를 만드는 방법은 무엇입니까?

new Thread(new Runnable() { 
      public void run() { 
      Sound.playSound("hurt.au"); 
      } 
     }).start(); 

을 (난 그냥 Sound.playSound ("hurt.au")을 할 경우 :

import java.io.File; 
import java.io.IOException; 

import javax.sound.sampled.AudioFormat; 
import javax.sound.sampled.AudioInputStream; 
import javax.sound.sampled.AudioSystem; 
import javax.sound.sampled.DataLine; 
import javax.sound.sampled.LineUnavailableException; 
import javax.sound.sampled.SourceDataLine; 

public class Sound { 
private final static int BUFFER_SIZE = 12800000; 
private static File soundFile; 
private static AudioInputStream audioStream; 
private static AudioFormat audioFormat; 
private static SourceDataLine sourceLine; 

/** 
* 
* @param filename the name of the file that is going to be played 
* 
*/ 
public static void playSound(String filename){ 

    String strFilename = filename; 

    try { 
     soundFile = new File(strFilename); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     System.exit(1); 
    } 

    try { 
     audioStream = AudioSystem.getAudioInputStream(soundFile); 
    } catch (Exception e){ 
     e.printStackTrace(); 
     System.exit(1); 
    } 

    audioFormat = audioStream.getFormat(); 

    DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFormat); 
    try { 
     sourceLine = (SourceDataLine) AudioSystem.getLine(info); 
     sourceLine.open(audioFormat); 
    } catch (LineUnavailableException e) { 
     e.printStackTrace(); 
     System.exit(1); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     System.exit(1); 
    } 


    sourceLine.start(); 

    int nBytesRead = 0; 
    byte[] abData = new byte[BUFFER_SIZE]; 
    while (nBytesRead != -1) { 
     try { 
      nBytesRead = audioStream.read(abData, 0, abData.length); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     if (nBytesRead >= 0) { 
      @SuppressWarnings("unused") 
      int nBytesWritten = sourceLine.write(abData, 0, nBytesRead); 
     } 
    } 

    sourceLine.drain(); 
    sourceLine.close(); 
} 
} 

내가 할을 활성화하려면 다음은 사운드 코드 게임 메인 스레드 그래서 나는 그것의 스레드를 동결에서 게임을 저장하기 위해 자신의 스레드를 넣어)

그럼, 어떻게 루프합니까?

+0

가장 간단한 방법은 루프하는 것입니다. 'while '안에 넣을 수 있습니다. 닉 로버트슨 (Nic Robertson)에 동의하지만, 아마도 'Slick2d'를 사용해야 할 것입니다. 이렇게하면 이런 일을하는 번거 로움을 줄일 수 있습니다. http://gamedev.stackexchange.com/search?q=Slick2d –

답변

1

현재 재생중인 사운드가 끝났는지 확인하려면 테스트가 필요합니다. 게임을하는 경우 라이브러리를 사용하여 쉽게 만들 것을 제안 할 수 있습니다. slick2d와 같은. 이것은 한 번만 연주하는 대신 사운드를 반복하는 inbuilt 함수를 가지고 있습니다. 당신이하지 않으려한다면, 당신은 실물을 추적하고 게임 상태를 업데이트 할 때마다 사운드 객체를보고 재생이 끝났는지를 물어보아야합니다. 그런 다음 sourceline.start() else no-op가있는 경우. 스레드를 sound.playsound 메서드 자체에 넣을 수도 있습니다. 그러면 코드가 조금 복잡해집니다.

http://www.slick2d.org/

는 정말하지만 자신에 그것을 쉽게하기 위해 제 3 자 라이브러리를 사용하는 것이 좋습니다.

+0

https : //[email protected]/teamzombie360/zombie 이것은 우리가 있던 SS 논문을위한 몇 주 동안 만든 게임과 나입니다. 하기. slick2d 사용. 소리는 src/utilities/BackgroundMusic.java에 있습니다. –

관련 문제