2012-02-16 7 views
1

공이 무한 루프에서 위아래로 움직입니다. 소리는 각 동작마다 재생됩니다. 그러나 매 5-6 개의 동작마다 재생되고 있습니다. 왜 그런 일이 일어나는거야? 사운드 지속 시간은 1 초 미만입니다. 코드에서 루프 반복마다 3 초 동안 절전 모드가됩니다. 그러나 수면 시간을 6 초로 변경하면 필요한 효과를 얻을 수 있습니다.자바 애니메이션 사운드가 제대로 재생되지 않습니다.

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 루프에서 오디오 파일 로딩 중 하나를 변경했습니다. 이것은 타이밍을 엉망으로 만드는 오랜 작업 일 수 있습니다.

al1 클래스의 전용 멤버 변수로 AudioStream as을 추가하고 생성자에서 초기화하십시오. 그런 다음 루프가 반복 될 때마다 이미 스트림을 준비하고 재생할 수 있습니다.

+0

코드를 실행하려고했지만 javax.sound.sampled SourceDataLine을 사용하여 동일한 오류가 발생했습니다. 생성자로 코드를 이동하는 것은별로 도움이되지 못했습니다. 경우에 따라 사운드가 늦게 들어오는 경우가 있었지만, 30 분의 1 범위로 내려갔습니다. 아주 궁금해서. –

1
  1. JavaSound info. 페이지에 표시된대로 Clip에 사운드를로드하십시오.
  2. 클립은 재생 시간을 지정하는 loop(int) 메서드를 제공합니다.
+0

이 동작하지 않습니다. 또한이 움직임이 무작위로되어 사운드가 재생되지 않습니다. –

0

sleep 명령을 try 블록 외부로 이동했지만 while 루프 내에서 sleep 명령을 이동하면 루프가 걸리는 시간에 약간의 불균형이 있지만 적어도 공과 사운드는 동기화 상태를 유지합니다.

정말 이상합니다. 나는 수면 배치가 중요한 이유를 알 수 없다. 마치 try 블록에서 새 repaint가 발생할 때까지 실행되지 않아 잠자기가 다음 재생을 유지하는 것처럼 보입니까? 그러나 어떻게 그럴 수 있을까요?

관련 문제