2012-02-16 79 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块中时,直到新的重绘发生之后才会执行,从而阻止下一次播放?但那怎么可能?