我试图通过创建一个小型 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 中运行时音频可以工作。图像仍然显示在导出中。为什么它可以处理图像,但不能处理音频?
非常感谢任何帮助!谢谢!!!
最佳答案
代替
getClass().getResource("/audio/backgroundMusic/casual.wav");
使用
getClass().getClassLoader().getResourceAsStream("/audio/backgroundMusic/casual.wav")
这样,它将从根查找,而不是从当前调用类的路径
关于java - 导出到 .JAR 时不会抓取资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40271973/