2012-02-16 16 views
1

ボールが無限ループで上下に移動しています。サウンドは各動きごとに再生されるはずです。しかし、それは5-6回の動きごとに行われています。なぜそれが起こっているのですか?音の持続時間は1秒未満です。コードでは、ループの各繰り返しで3秒間スリープ状態になります。ただし、スリープ時間を6秒に変更すると、必要な効果が得られます。Javaアニメーションのサウンドが正しく再生されない

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import sun.audio.*; 
import java.io.*; 

public class dabble { 

private boolean z=false; 
private int x=10; 
private int y=10; 
private JFrame frame; 
private JLabel label; 
private mypanel panel; 
private JButton b1; 
private JButton b2; 

public static void main (String[] args) throws Exception 
{ 
    dabble dab = new dabble(); 
    dab.start(); 
} 

void start() 
{ 
    frame = new JFrame(); 
    label = new JLabel(); 
    panel = new mypanel(); 
    b1= new JButton("Start"); 
    b2= new JButton("Stop"); 

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    b1.addActionListener(new al1()); 
    b2.addActionListener(new al2()); 

    frame.getContentPane().add(BorderLayout.NORTH,b1); 
    frame.getContentPane().add(BorderLayout.SOUTH,b2); 
    frame.getContentPane().add(BorderLayout.CENTER,panel); 
    frame.getContentPane().add(BorderLayout.EAST,label); 
    frame.setSize(600,600); 
    frame.setVisible(true); 
} 

class al1 implements ActionListener{ 
    public void actionPerformed(ActionEvent event){ 
     if (z==false) 
     { 
      class myrun implements Runnable{ 
       public void run(){ 
        z=true; 
        while(z==true) 
        { 
         y=510-y; 
         panel.repaint(); 
         try 
         { 
          InputStream in=new FileInputStream("hit.wav"); 
          AudioStream as=new AudioStream(in); 
          AudioPlayer.player.start(as); 
          Thread.sleep(3000); 
         } 
         catch(Exception Ex){} 
        } 
       } 
      } 

      Runnable myjob = new myrun(); 
      Thread mythread = new Thread(myjob); 
      mythread.start(); 

     } 
    } 
} 

class al2 implements ActionListener{ 
    public void actionPerformed(ActionEvent event){ 
     z=false; 
    } 
} 

class mypanel extends JPanel { 
    public void paintComponent (Graphics g){ 
     g.setColor(Color.white); 
     g.fillRect(0,0,this.getWidth(),this.getHeight()); 
     int red = (int) (Math.random()*255); 
     int green = (int) (Math.random()*255); 
     int blue = (int) (Math.random()*255); 
     Color c1 = new Color(red,green,blue); 
     g.setColor(c1); 
     g.fillOval(x,y,20,20); 
    } 
} 
} 

答えて

0

私が変更することの1つは、whileループでのオーディオファイルの読み込みです。これは、タイミングを狂わせている長い操作である可能性があります。

al1クラスのプライベートメンバー変数としてAudioStream asを追加し、コンストラクタで初期化します。次に、ループが繰り返されるたびに、ストリームを準備しておき、それを再生するだけです。

+0

私はコードを実行しようとしましたが、javax.sound.sampledのSourceDataLineで同じエラーが発生しました。コンストラクタへのコードの移動はそれほど役に立ちませんでした。機会が30分の1の範囲に収まっていたにもかかわらず、音がまだ遅くなっていた。とても好奇心が強い。 –

1
  1. JavaSound info.ページに示すように、サウンドをClipにロードします。
  2. クリップには、再生時間を指定するloop(int)メソッドがあります。
+0

これは動作しません。また、この動きがランダムになってサウンドが再生されません –

0

sleepコマンドをtryブロックの外側に移動してwhileループ内に移動すると、ループの長さにはまだ不均等がありますが、少なくともボールとサウンドは同期しています。

本当に変です。私は睡眠の配置が重要な理由を理解できません。これは、tryブロック内のスリープが新しいペイントが発生するまで実行されず、次のプレイを保持しているかのようです。しかし、どうしてそんなことができますか?

関連する問題