我已經瀏覽了互聯網上播放wav文件的方式,但是我發現它們不會在單獨的線程中播放,因此會導致程序停止播放,直到歌曲完成,這對遊戲無效。但是,當我嘗試在單獨的線程上播放所有內容時,它會滯後。有沒有人有這方面的修復?如何播放沒有滯後的wav文件?
注:我也是畫在不斷的背景:
public class DrawThread extends Thread {
JFrame j;
public DrawThread(JFrame frame) {
j = frame;
}
public void run() {
while (!(isInterrupted())) {
if (j.isDisplayable() && j.isActive() && j.isEnabled())
j.update(j.getGraphics());
}
}
}
和更新只是調用paint是:
public void paint(Graphics g) {
Graphics2D bg = (Graphics2D) g;
bg.setBackground(Color.black);
int w = (int) Toolkit.getDefaultToolkit().getScreenSize().getWidth();
int h = (int) Toolkit.getDefaultToolkit().getScreenSize().getHeight();
if (time < 500) {
x[time] = r.nextInt(w) + 150;
y[time] = h;
z[time] = r.nextInt(w) + 150;
time++;
}
for (int i = 0; i < time; i++) {
y[i] -= forward;
x[i] -= right;
if (y[i] < 1) {
x[i] = r.nextInt(400) - 200;
y[i] = 300;
z[i] = r.nextInt(400) - 200;
} else if (y[i] > 300) {
x[i] = r.nextInt(400) - 200;
y[i] = 1;
z[i] = r.nextInt(400) - 200;
}
if (x[i] > 200)
x[i] = -200;
else if (x[i] < -200)
x[i] = 200;
bg.setColor(color);
bg.drawLine(
getWidth()/2 + (int) Math.round(x[i] * 200/y[i]),
getHeight()/2 + (int) Math.round(z[i] * 200/y[i]),
getWidth()
/2
+ (int) Math.round((x[i] + right) * 200
/Math.abs(y[i] + forward)),
getHeight()
/2
+ (int) Math.round((z[i]) * 200
/Math.abs(y[i] + forward)));
}
}
編輯:添加我使用的音樂播放器類(我已經切換到BigClip):
import java.io.File;
import java.util.Collection;
import java.util.HashMap;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import org.crystalix.util.SoundListener;
public class MSHandler {
public static boolean pause = false;
public static boolean stop = false;
private static HashMap<String, BigClip> clips = new HashMap<String, BigClip>();
public static void stopAll() {
Collection<BigClip> c = clips.values();
for (BigClip b : c) {
System.out.println("Stopping "+b.toString());
b.stop();
System.out.println("Stopped "+b.toString());
}
}
public static void playMusic(File file) {
try {
AudioInputStream audioIn = AudioSystem.getAudioInputStream(file);
BigClip clip = new BigClip();
clip.open(audioIn);
clip.addLineListener(new SoundListener());
clip.loop(1);
clip.start();
clips.put(file.getName(), clip);
} catch (Exception e) {
System.err.println("Sound could not be started!");
e.printStackTrace(System.err);
}
}
}
1)'j.update(j.getGraphics());'不要那樣做。這很可能導致許多其他問題。 2)爲了更快地獲得更好的幫助,請發佈[SSCCE](http://sscce.org/)。 3)使用'Clip'作爲聲音,如[Java Sound tag Wiki](http://stackoverflow.com/tags/javasound/info)所示。 –
你會如何建議我儘可能經常畫畫?這是我能找到的重複繪製的唯一方法,因爲它默認不會這樣做。此外,該文件是音樂,沒有聲音,所以剪輯不起作用,因爲它太大。我實際上使用剪輯,它失敗了。 –
*「您會如何嘗試儘可能頻繁地繪畫?」*使用直接與視頻卡連接的語言。 *「..它太大了,我實際上使用了Clip並且失敗了」*在這種情況下,請使用['BigClip'](http://stackoverflow.com/a/5668510/418556)。 –