我正试图通过创建一个小型2D游戏来更好地理解Java。我觉得最好的学习方式就是努力学习,所以我尽量不去解决任何问题。我自己就解决了。但是,我已经尝试了几乎所有我无法在我的游戏导出版本中播放背景音乐。使用“getClass()”方法工作的所有图像都可以正常工作,但是音乐没有。
对不起,我必须把我的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中运行时有效。图像仍显示在导出中。为什么它适用于图像,而不是音频?
非常感谢任何帮助!谢谢!!!
答案 0 :(得分:1)
而不是
getClass().getResource("/audio/backgroundMusic/casual.wav");
使用强>
getClass().getClassLoader().getResourceAsStream("/audio/backgroundMusic/casual.wav")
通过这种方式,从当前调用类
的路径从根,而不是查看