我正在开展一个有趣的项目,并希望得到一些帮助。目前我正试图在我的游戏中实现声音。就目前而言,这是我的代码......
public static volatile boolean shutdown = false;
//This is a method to play sound
public static void play(String name) {
shutDown();
Runnable myRunnable = new Runnable() {
public void run() {
try {
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(Main.class.getResource(name));
Clip clip = AudioSystem.getClip();
clip.open(audioInputStream);
clip.start();
while (!shutdown) {
}
clip.close();
} catch (Exception ex) {
}
}
};
Thread thread = new Thread(myRunnable);
thread.start();
}
public static void shutDown() {
shutdown = true;
shutdown = false;
}
目前,我编写的代码有效。虽然我有一些问题。有时当我跑两次它可以互相播放音乐。另一个问题是,在我的声音开始之前,有时候会有明显的延迟。任何帮助都会很棒!
答案 0 :(得分:0)
首先,您使用Clip的方式与其设计用途相悖。剪辑意味着预先加载到内存中,并保留在您需要时可以调用的状态。然后,当它成为播放提示的时间时,您只执行start方法,或者可能将帧位置重新定位回开头,然后调用start。
凭借您现在所拥有的,您可以预期各种延迟问题。每次调用play时,系统都必须将整个文件加载到内存中。在这个阶段完全完成之前,它甚至不会开始玩。如果提示太大而您不想将其保留在RAM中,那么最好的办法是使用SourceDataLine而不是Clip。使用SourceDataLine,只有将缓冲区的值加载到内存后才会开始播放。
如果你想要同时播放提示,我不清楚你写的是什么,所以我还不知道如何回答你帖子的这一部分。
另外,我想推荐一个专门为游戏音频使用而写的课程。它被称为AudioCue,你可以在Java-gaming.org查看它。代码源在BSD许可下可用(换句话说,它是免费的,您可以编辑它)。我非常努力地使它尽可能地像其他Java类一样,并且在Javadocs / API中投入了大量的工作。该类与Clip类似,但对于 fire-and-forget 播放更简单,以及其他功能(例如,良好的音量,平移和速度控制)。不#"图书馆"要加载,只需将三个类粘贴到您的项目中,随时修改它。