2017-10-29 16 views
0

私はnetbeansでJavaゲームでバックグラウンドミュージックを演奏するこのクラスを持っています。私はキャラクターが死ぬと音を止める方法をいくつか考えています。私はpublic boolean isCollided変数を作成しようとしましたが、私のキャラクターが別のオブジェクトと衝突しても動作しませんでした。私は提案に開放されています。Javaゲームのサウンドを停止する方法

import controller.Main; 
import javax.sound.sampled.AudioSystem; 
import javax.sound.sampled.Clip; 

public static boolean isCollided = false; 

public static void play(String filename) { 
    new Thread(new Runnable() { 

     public void run() { 
      try { 
       Clip clip = AudioSystem.getClip(); 
       clip.open(AudioSystem.getAudioInputStream(Main.class.getResourceAsStream(filename)));// new 
                             // File(filename))); 
       if (isCollided) { 
        clip.stop(); 
       } else { 
        clip.loop(0); 
       } 
      } catch (Exception exc) { 
       exc.printStackTrace(System.out); 
      } 
     } 
    }).start(); 
} 
+0

静的でないメンバ変数にアクセスする静的メソッドはどのようにありますか?また、セミコロンがありません。少なくともコンパイルして問題を示すコードを投稿してください。 – Dave

+0

申し訳ありませんが、手で入力する必要があります。 – Marco

答えて

1

はあなたが私はあなたには、いくつかの編集をした参照

clip.stop(); 

https://docs.oracle.com/javase/7/docs/api/javax/sound/sampled/DataLine.html#stop()

を使用しようとしています。スレッドでクリップを実行しているので、メインメソッドのスレッドとやりとりする方法が必要です。それ以外の場合は、スレッドが開始されたときにisCollidedをチェックし、変更をチェックすることはありません。

isCollidedをグローバル変数にしてから、クリップスレッドに無限ループを設定してisCollidedをチェックし、それがtrueになると停止する方法があります。何か(あなたの変数で)

while (true) { 
    if (isCollided) { 
    clip.stop(); 
    thread.interupt(); 
    } 
} 

ETA:これは非常にプロセッサー集中です。あなたは多分あまりにも多くのあなたのプロセッサを停滞から、それを維持するために

while (true) { 
    Thread.sleep(500); 
    if (isCollided) { 
    clip.stop(); 
    thread.interupt(); 
    } 
} 

のように少し遅れを追加することができます。

+0

ええ、コードを更新しました。私はclip.stop()メソッドが動作すると思います。そのisCollided変数は更新されませんでした。私はSystem.out.println(isCollided)を置いて、一度しか印刷しません。だから私は衝突すると仮定して、isCollided変数は更新されません。したがって、常に偽です。 – Marco

+0

@Marco Javaは値渡しです。これをチェックしてください。 https://stackoverflow.com/questions/20647969/change-boolean – StarCoder

+0

通常、スレッドを中断することはお勧めできません。スレッドが実行をきれいに完了できるようにするメカニズムを構築する方がよいでしょう。 – Dave

関連する問題