2012-02-16 74 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

我想改變的一件事是在while循環中加載音頻文件。這可能是一個漫長的操作,搞亂了時機。

添加AudioStream as作爲al1類的私有成員變量,並在構造函數中初始化它。然後,每次循環迭代時,您已經準備好了流,您可以播放它。

+0

我試着運行代碼,但用javax.sound.sampled SourceDataLine,並得到了同樣的錯誤。將代碼移到構造函數中並沒有多大幫助。儘管場合下降到了30分之一的範圍,但仍然有些聲音來得太遲。非常好奇。 – 2012-02-16 20:31:10

1
  1. 將聲音載入Clip,如JavaSound info.頁所示。
  2. Clip提供了一個loop(int)方法來指定播放時間的數量。
+0

這不起作用,而且隨着這個動作變得隨機而且不起作用 – 2012-02-17 08:52:06

0

當我將睡眠命令移動到try塊外部,但仍在while循環內時,循環花費的時間仍然存在一些不均勻性,但至少球和聲音保持同步。

雖然真的很奇怪。我無法弄清楚爲什麼睡眠安置很重要。就好像睡眠在try塊中時,直到新的重繪發生之後纔會執行,從而阻止下一次播放?但那怎麼可能?