本帖最后由 hnd201031000407 于 2012-04-20 15:24:52 编辑

解决方案 »

  1.   

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

  2.   

    你这个方法我试过,行不通。因为clip如果只new过一次那么就只能播放一次,播完再start是没声音的。
    除非再setFramePosition设置回到一开始的位置。但是这样子的话就有一个问题,因为开炮很密集,所以上一个声音还没播放完,这边又调用他了,那边没播完这里再setFramePosition回到起点肯定行不通。
      

  3.   

    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();