2010-08-02 5 views
0

두 가지 질문이 있습니다. (1) 작은 소리 클립을 재생하는 방법. 접시 비행, 총알 총격, 총알 등으로 치는 일 등이 있습니다. 매우 짧지 만 실시간으로 들립니다. 나는 옛날 아케이드 소리가 마음에 들었으므로 큰 소리는 필요 없다 .wav. 가능한 한 적은 코드로이를 실행하고 싶습니다. 어느 내 두 번째 질문에 이르게 ... (2)이 사운드 클립을 찾을 수있는 위치를 아는 사람이 있습니까?Java 게임 소리가 응용 프로그램에서 (예 : 애플릿이 아닌)

약간의 메모, 나는 여기에 몇 가지 답변을 보았는데, 불완전한 것처럼 보입니다. 직선적이고 포괄적 인 코드를 사용하면 좋습니다! 나는 게임에 대한 필자의 생각을 이해하지 못한다.

모든 정보를 제공해 주셔서 감사합니다. 감사드립니다!

+1

"불완전한 답변"에 대해 불평하지 마십시오.누군가가 당신을위한 프레임 워크를 작성하게하기 위해 ** API가 아닌 관련 섹션을 가리 키도록해야합니다. – finnw

+0

프레임 워크를 묻지 않았습니다. Java에서 사운드에 대해 잘 모르는 사람들에게 유용한 대답입니다. API가 항상 일을 잘 설명하지는 않습니다. 먼저 거기에갔습니다. –

답변

1

시도하지 말라, 그것은 간단한 사운드 효과가 가능합니다. 스레드를 사용하여 (여부)

import javax.sound.sampled.*; 
import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class AppWithSound2 extends JFrame implements ActionListener { 
    JButton b1; 
    JButton b2; 

    private static final long serialVersionUID = 1L; 

    public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
     AppWithSound2 app = new AppWithSound2(); 
     app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     app.startApp(); 
     } 
    }); 
    } 

    public AppWithSound2() { 
    initGUI(); 
    } 

    private void startApp() { 
    setVisible(true); 
    } 

    private void initGUI() { 
    setLayout(new FlowLayout()); 
    setSize(300, 200); 
    b1 = new JButton("Sound with no thread"); 
    b2 = new JButton("Sound with thread"); 
    b1.addActionListener(this); 
    b2.addActionListener(this); 
    add(b1); 
    add(b2); 
    } 

    public void actionPerformed(ActionEvent e) { 
    if (e.getSource() == b1) { 
     LaserSound.laser(); 
    } 
    if (e.getSource() == b2) { 
     new LaserSound().start(); 
    } 
    } 
} 

class LaserSound extends Thread { 

    public void run() { 
    LaserSound.laser(); 
    } 

    public static void laser() { 
    int repeat = 10; 
    try { 
     AudioFormat af = new AudioFormat(8000f, // sampleRate 
      8, // sampleSizeInBits 
      1, // channels 
      true, // signed 
      false); // bigEndian 
     SourceDataLine sdl; 
     sdl = AudioSystem.getSourceDataLine(af); 
     sdl.open(af); 
     sdl.start(); 

     byte[] buf = new byte[1]; 
     int step; 

     for (int j = 0; j < repeat; j++) { 
     step = 10; 
     for (int i = 0; i < 2000; i++) { 
      buf[0] = ((i % step > 0) ? 32 : (byte) 0); 

      if (i % 250 == 0) 
      step += 2; 
      sdl.write(buf, 0, 1); 
     } 
     Thread.sleep(200); 
     } 
     sdl.drain(); 
     sdl.stop(); 
     sdl.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    } 
} 
+0

와우 -이게 정말 필요한 것 같습니다. 실제로 코드를 실행하지는 않았지만 자체 사운드를 만들고 애플릿이 아닌 응용 프로그램에 있습니다. –

+0

불행히도 사운드는 호출 될 때마다 작업을 중지하는 것 같습니다. 나는 그 옛날 아케이드 사운드를 정말 좋아한다고 말하고 싶다. 나는 그저 그다지 향수가 없다. 나는 내 게임 속으로 들어가기를 원한다. ... –

+0

나는 당신이 그 사운드를 그 사운드로 만들어야한다고 믿는다. 자신의 스레드. – RealHowTo

1

나는 API 부분에 대해 알고 있지만, 소리에 대한 javax.sound를 사용 www.sounddogs.com

+0

감사합니다. Michael. 그러나 이것은 무료가 아닙니다. (평가 목적으로 만). –

0

Clip 인터페이스는 앱에서 작은 소리를 재생하는 가장 쉬운 방법입니다 :

Produce special sound effect


편집을 참조하십시오. Here이 그 예입니다. wav가 아닌 다른 것을 연주하려면 JavaZOOM에서 MP3SPI 또는 VorbisSPI를 사용하십시오.

+0

감사합니다 tulskiy,하지만 Java 응용 프로그램을 찾고 있어요. –

+0

@Scott Foulk : 이것은 자바입니다! –

+0

글쎄 Tulskiy, 당신 말이 맞아요 - 애플릿을 보았고 그것이 애플릿 전용이라고 생각했습니다. 아래 코드 (아래 참조)가 작동하지 않아 링크 된 코드가 삽입되었습니다. 잠시 동안 작동하는 것처럼 보였지만 소리는 2 ~ 3 번 씩만 나왔습니다. 그 직후에는 완전히 멈 춥니 다. 자바 사운드가 작동하기 위해서는 적어도 한번 이상 악몽처럼 느껴질 것입니다 ... –

0

오케이 녀석 - 여기 내가 기다리는 동안 내가 생각해내는 것이있다. 내 질문에 답을 할 때 전자 메일로 스택 오버플로 설정을 설정 했으므로 아직 답변을받지 못했다고 생각했습니다. 그래서 나는 혼자 계속했다. 내가 찾은 바가 그 것이다.

(1) 본을 사용하여 인스턴스를 만듭니다

private PlaySounds lasershot = new PlaySounds("snd/lasershot.wav"); 
private PlaySounds test = new PlaySounds("snd/cash_register.au"); 

(2) 그리고 (또는 당신이 좋아하는 무엇이든) 파일 PlaySounds.java을 만들 가져 오기는 java.io ; import javax.media.;

공개 클래스 PlaySounds { private player player; 개인 파일 파일;

// Create a player for each of the sound files 
    public PlaySounds(String filename) 
    { 
     file = new File(filename); 
     createPlayer(); 
    } 

    private void createPlayer() 
    { 
     if (file == null) 
      return; 

     try 
     { 
      // create a new player and add listener 
      player = Manager.createPlayer(file.toURI().toURL()); 
      //player.addController((Controller) new EventHandler(player, null, null, null)); 
      // player.start(); // start player 
     } 
     catch (Exception e) 
     { 
     } 
    } 

    public void playSound() 
    { 
     // start player 
     player.start(); 
     // Clear player 
     player = null; 
     // Re-create player 
     createPlayer(); 
    } 

} 파일 PlaySounds.java의 // 끝


(3) 소리를 원하는 곳이 삽입 사용하려면 :

lasershot.playSound(); 
test.playSound(); 

이이었다 내가 찾은 가장 짧은/가장 달콤한. 매우 사용하기 쉽고 .au 및 .wav 파일을 모두 재생합니다.

귀하의 모든 도움을 주셔서 감사합니다.

+0

알았어 - <알몸의 달걀> 이것은 작동하지 않았다. 글 머리 기호를 약 1 ~ 3 분 동안 촬영 한 후 응용 프로그램의 메모리가 부족합니다. 그것은 아주 잘 작동하는 것처럼 보입니다. 다시 사각형으로 돌아갑니다. –

+0

좋아요 - 내가 쓴 것 중 가장 좋은 것은 메모리 문제를 제외하고. 요구시 재생되는 사운드는 비주얼에서 지연없이 재생됩니다. 아무도 나에게이 물건을 작동시키는 법을 말할 수 있습니까? 나는 매우 좌절하고있다. –

관련 문제