我已经开始用 Java 制作一个基本的游戏了。
一切进展顺利,我有地图加载,绘图工作正常等。
我让它为地图播放音乐,为碰撞之类的东西播放音效。
但是我觉得 MAP A(我要离开的那个)的音乐应该淡入 MAP B(我正在进入的那个地图)的音乐中,这可能吗?
我用来播放音乐的代码如下:
try
{
if(clip != null)
{
clip.stop();
clip.close();
}
clip = AudioSystem.getClip();
URL a = this.getClass().getResource("/resource/sound/"+Filename + ".mid");
ais = AudioSystem.getAudioInputStream(a);
clip.open(ais);
clip.loop(999);
clip.start();
}
catch(Exception e)
{
}
正如您很可能看到的那样,我在 Java 方面不是很好,但我的游戏到目前为止进展顺利,但我不是,我拒绝使用“引擎”,因为我想要完全控制。
有任何想法吗?
谢谢
编辑:
感谢所有的答案,我已经修改了你给我的代码,但它不起作用=/
我现在制作了下面的代码,它在一个新线程上运行(因此是 Runnable),因此音乐在播放时会消失。
代码如下:
private Boolean _SwapMusic = false;
private String _Filename;
Thread soundThread;
Runnable r1 = new Runnable() {
public void run() {
while(true)
{
if(_SwapMusic)
{
_SwapMusic = false;
try
{
//Try to lower volume
for (int i = 0; i < 80; i ++) {
FloatControl gainControlA = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
gainControlA.setValue(i * -1f);
Thread.sleep(10);
}
}
catch(Exception e){ System.out.print("Lower volume error: " + e + " ");}
try{
clip.stop();
clip.close();
}
catch (Exception e) { System.out.print("clip.stop/close error: " + e + " ");}
try
{
clip = AudioSystem.getClip();
URL a = this.getClass().getResource("/resource/sound/"+ _Filename + ".mid");
ais = AudioSystem.getAudioInputStream(a);
clip.open(ais);
FloatControl gainControlB = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
gainControlB.setValue(-80f);
clip.loop(999);
clip.start();
}
catch(Exception e){ System.out.print("Play error: " + e + " ");}
try
{
//Try to higher volume
for (int i = -80; i < 0; i ++) {
FloatControl gainControlC = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
gainControlC.setValue(i);
Thread.sleep(3);
}
}
catch(Exception e){
System.out.print("Higher volume error: " + e + " ");
}
}
}
}
};
只是为了说明这一点,我试图让 MAP A 的音乐在 MAP B 的音乐开始之前完全消失。
感谢到目前为止的所有帮助。