当前位置:编程学习 > JAVA >>

用J2se做游戏音乐时的问题

--------------------编程问答-------------------- 把不同的音乐做成不同的clip对象,缓存在Audio中,播放方法做成静态方法.
放背景音乐就直接调用Audio.playBG(),里面调用bgClip.loop(-1)循环播放
开炮就调用Audio.playFire(),里面调用fireClip.start(),播放一次. --------------------编程问答--------------------
引用 1 楼  的回复:
把不同的音乐做成不同的clip对象,缓存在Audio中,播放方法做成静态方法.
放背景音乐就直接调用Audio.playBG(),里面调用bgClip.loop(-1)循环播放
开炮就调用Audio.playFire(),里面调用fireClip.start(),播放一次.

你这个方法我试过,行不通。因为clip如果只new过一次那么就只能播放一次,播完再start是没声音的。
除非再setFramePosition设置回到一开始的位置。但是这样子的话就有一个问题,因为开炮很密集,所以上一个声音还没播放完,这边又调用他了,那边没播完这里再setFramePosition回到起点肯定行不通。 --------------------编程问答-------------------- start只会播放一次,可以用loop(1)替换播放多次。不过由于你开炮密集的原因,为了达到并发播放,可以先把声音file读入byte[]中缓存起来,然后每次开炮时去重新播放。

//sample code for file to byte[] 
InputStream input = null;
try {
input = new FileInputStream("C:\\Windows\\Media\\tada.wav");
ByteArrayOutputStream output = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int n = 0;
while ((n = input.read(buffer)) != -1) {
output.write(buffer, 0, n);
}
wavBytes = output.toByteArray();//wavBytes is a cached byte[]
} catch (IOException e) {
e.printStackTrace();
} finally {
if (input != null) {
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//code for fire
AudioInputStream in = AudioSystem.getAudioInputStream(new ByteArrayInputStream(wavBytes));
Clip clip = AudioSystem.getClip();
clip.open(in);
clip.start();
--------------------编程问答-------------------- --------------------编程问答-------------------- 组件一个资源池,在资源池中调用
补充:Java ,  Java SE
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,