2012-07-11 42 views
1

我有一個主遊戲發生在遊戲邏輯。我只是說聲音播放按照文件,我發現:多線程只能用Java播放背景音樂嗎?

//////////////////////SOUND///////////////////////// 
    SourceDataLine soundLine = null; 
    int BUFFER_SIZE = 64*1024; // 64 KB 

     // Set up an audio input stream piped from the sound file. 
     try { 
     File soundFile = new File("tim ph3 samplepart1.wav"); 
     AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(soundFile); 
     AudioFormat audioFormat = audioInputStream.getFormat(); 
     DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFormat); 
     soundLine = (SourceDataLine) AudioSystem.getLine(info); 
     soundLine.open(audioFormat); 
     soundLine.start(); 
     int nBytesRead = 0; 
     byte[] sampledData = new byte[BUFFER_SIZE]; 
     while (nBytesRead != -1) { 
      nBytesRead = audioInputStream.read(sampledData, 0, sampledData.length); 
      if (nBytesRead >= 0) { 
       // Writes audio data to the mixer via this source data line. 
       soundLine.write(sampledData, 0, nBytesRead); 
      } 
     } 
     } catch (UnsupportedAudioFileException ex) { 
     ex.printStackTrace(); 
     } catch (IOException ex) { 
     ex.printStackTrace(); 
     } catch (LineUnavailableException ex) { 
     ex.printStackTrace(); 
     } finally { 
     soundLine.drain(); 
     soundLine.close(); 
     } 
    ///////////////////////////////////////////////////// 

它發揮我指定了文件的Eclipse中我的項目文件夾中的文件。

問題?它會阻止所有遊戲邏輯出現在主體之後。

這是有道理的 - 該程序是連續的,直到整首歌完成...我認爲遊戲無法繼續下去。

這顯然不會起作用,看起來我將不得不去看可怕的多線程......但在此之前......我想......是否有Java庫或其他在這種情況下避免多線程的巧妙解決方案?

+1

多線程並不是所有這些令人害怕的東西。我記得在學習之前也有同樣的感覺,但它非常合乎邏輯。調試線程間某些共享資源中存在的錯誤,現在* *我害怕:) – 2012-07-11 19:58:07

+1

這不是播放音樂的唯一方式,但它是唯一的方法,如果您想同時做其他任何事情!換句話說,你在這裏沒有選擇。學習如何多線程並獲得一些樂趣。 – 2012-07-11 19:58:27

+0

D'awww好吧我想我會學習一些東西haha – PinkElephantsOnParade 2012-07-11 19:59:42

回答

0

小心:知道如何啓動一個線程,並知道如何安全地多線程的程序是2米不同的東西。目前,請確保您避免觸碰多個線程中的相同音樂。

+0

正確 - 我曾經在一些課程中使用C多線程,因爲你提到的潘多拉盒子而感到害怕。謝天謝地,我想要的只是我的主線,音樂播放器,也許是聊天,所以這不是什麼大問題! – PinkElephantsOnParade 2012-07-11 20:14:01

+0

很酷。只要沒有任何對象在線程之間共享,您無需擔心。幸運的是,Java有幾個類和措施來支持同步操作 - 實際上,您主要需要注意死鎖。 (I.E.A需要B釋放C才能繼續,B需要A釋放C才能繼續) – BicMacinaPimpHat 2012-07-11 20:17:52