やることと同じように、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の音楽を作成しようとしていることを、MAPBの音楽が始まる前に完全にフェードさせます。
これまでのすべての助けに感謝します。