не воспроизводится звук анимации Java - PullRequest
1 голос
/ 16 февраля 2012

Мяч движется вверх и вниз по бесконечной петле.Звук должен играть для каждого движения.Но это играется для каждых 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);
    }
}
}

Ответы [ 3 ]

1 голос
/ 16 февраля 2012
  1. Загрузка звука в формате Clip, как показано на странице Информация о JavaSound. Страница.
  2. Клип предлагает метод loop(int) для указания количества времени воспроизведения.
0 голосов
/ 17 февраля 2012

Когда я перемещаю команду sleep вне блока try, но все еще в цикле while, все еще есть некоторая неравномерность в том, сколько времени занимает цикл, но по крайней мере мяч и звук остаются синхронизированными.* Действительно странно, хотя.Я не могу понять, почему размещение сна имеет значение.Как будто сон, находящийся в блоке try, не выполняется до тех пор, пока не произойдет новое перерисовывание, и, таким образом, задерживает следующую игру?Но как это могло быть?

0 голосов
/ 16 февраля 2012

Одна вещь, которую я бы изменил, это загрузка аудиофайла в цикле while.Это может быть длительная операция, которая портит время.

Добавьте AudioStream as в качестве закрытой переменной-члена класса al1 и инициализируйте ее в конструкторе.Затем, каждый раз, когда цикл повторяется, у вас уже есть готовый поток, и вы можете просто воспроизвести его.

...