2016-10-26 14 views
0

小さな2Dゲームを作成することで、Javaの理解を深めようとしています。私は学習に最善の方法が苦労しているように感じるので、私が持っている問題については助けを得ないようにしています。私はただ自分でそれを解決します。しかし、私は私のゲームの輸出版で私のバックグラウンドミュージックを再生できないものはほとんどすべて試しました。すべての画像が機能し、 "getClass()"メソッドを使って引っ張られたものはすべて取り込まれますが、音楽はそうではありません。.JARへのエクスポート時にリソースが取得されない

申し訳ありませんが、私はBackgroundMusicManagerクラスのコードをすべて入れなければなりませんが、ヘルプなしで処理したいので、私のプログラムの最初のバージョンは通常とても面倒で、多くの最適化が必要です。要するに、物事がどのように機能するかを実際に確認するために、物事が呼び出され、初期化されているかどうかを知る必要があります。

package com.cs.dd.audioManager; 

import java.io.*; 
import java.net.URL; 
import java.net.URLDecoder; 

import javax.sound.sampled.*; 
import com.nickgirga.dd.main.*; 

import sun.applet.Main; 

public class BackgroundMusicManager implements Runnable { 
    //URLs 
    public URL mmBgMusicURL = getClass().getResource("/audio/backgroundMusic/casual.wav"); 

    //Files 
    public File[] bgMusics = { new File(mmBgMusicURL.getFile()) }; 

    public File bgMusic = bgMusics[0]; 
    private static Clip clip; 

    public static int newGameState; 

    public static boolean enabled = true; 
    public static boolean asPlaying = false; 

    public static Thread bgMusicPlayer = new Thread(new BackgroundMusicManager()); 

    public void play() { 
     if (enabled) { 
      try { 
       if (bgMusic != null) clip = AudioSystem.getClip(); 
       if (bgMusic != null) clip.open(AudioSystem.getAudioInputStream(bgMusic)); 
       if (bgMusic != null) clip.start(); 

       //System.out.println(bgMusics[0].getAbsolutePath()); 

       loopChecker(); 
       bgMusicPlayer.wait(); 

      } catch (LineUnavailableException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } catch (UnsupportedAudioFileException e) { 
       e.printStackTrace(); 
      } catch (Exception e) { 
       //e.printStackTrace(); 
      } 
     } 
    } 

    public void loopChecker() { 
     while (true) { 

      if (clip.getMicrosecondPosition() >= clip.getMicrosecondLength()) { 
       bgMusicPlayer.notify(); 
      } 

      if (!(GameState.state == newGameState)) { 
       setClip(); 
      } 
     } 
    } 

    public void setClip() { 
     //System.out.println("setClip"); 
     newGameState = GameState.state; 
     if (GameState.state == 0) { 
      clip.stop(); 
      bgMusic = bgMusics[0]; 
      bgMusicPlayer.notify(); 
     } else { 
      if (GameState.state == 1) { 
       clip.stop(); 
       bgMusic = bgMusics[0]; 
       bgMusicPlayer.notify(); 
      } else { 
       clip.stop(); 
       bgMusic = null; 
       bgMusicPlayer.notify(); 
      } 
     } 
    } 

    @Override 
    public void run() { 
     while (true) { 
      play(); 
     } 
    } 
} 

それにパックライブラリでJARとしてこれをエクスポートした後、コンソールが読み取ります

java.io.FileNotFoundException: audio\backgroundMusic\casual.wav (The system cannot find the path specified) 
    at java.io.FileInputStream.open0(Native Method) 
    at java.io.FileInputStream.open(Unknown Source) 
    at java.io.FileInputStream.<init>(Unknown Source) 
    at com.sun.media.sound.WaveFloatFileReader.getAudioInputStream(Unknown Source) 
    at javax.sound.sampled.AudioSystem.getAudioInputStream(Unknown Source) 
    at com.cs.dd.audioManager.BackgroundMusicManager.play(BackgroundMusicManager.java:33) 
    at com.cs.dd.audioManager.BackgroundMusicManager.run(BackgroundMusicManager.java:89) 
    at java.lang.Thread.run(Unknown Source) 

を私はJARを抽出し、正確な場所にFileNotFoundExceptionポイントファイルを見つけたので、私は左です非常に混乱。オーディオはEclipseで動作している間に動作します。イメージは引き続きエクスポートに表示されます。なぜ画像ではなく、オーディオでは動作しますか?

ご協力いただきありがとうございます。ありがとうございました!!!

答えて

1

の代わりに、それは現在呼び出し元のクラスのパスからではない、ルートから見ていきます。このように

getClass().getResource("/audio/backgroundMusic/casual.wav"); 

使用

getClass().getClassLoader().getResourceAsStream("/audio/backgroundMusic/casual.wav") 

+0

私はそれを試みましたが、それはまだエディタで再生されますが、エクスポートすると出力されません。 – nickgg

関連する問題