Когда я запускаю этот код, он просто зависает во время воспроизведения звука.Однако я хочу, чтобы анимация запускалась одновременно со звуком.Как я могу это сделать? - PullRequest
0 голосов
/ 26 апреля 2019

Я пытался анимировать персонажа, используя Java Swing Graphics. Я перехожу с основного экрана на JPanel, который должен одновременно отображать анимацию во время работы аудио (WAV-файл). Однако сначала запускается звук, а затем отображается и анимируется JPanel.

Как я могу исправить эту ошибку в моем коде, чтобы аудио и анимация работали одновременно?

Я знаю, что с моей функцией Thread.sleep () произошла ошибка, которая заставляет весь поток спать. Но я не могу понять, как запустить мой звук без Thread.sleep (), и потоки не будут работать одновременно с присутствующим методом Thread.sleep ().

Я сейчас использую Java 8.

Аудио класс

import java.io.*;
import javax.sound.sampled.*;
public class AudioManager
{
    static AudioInputStream audioInputStream = null;
    static Clip curClip = null;

    public static void playSound(String fileName)
    {

        System.out.println("Playing Sound");

            new Thread(new Runnable() 
            {

                public void run() 
                {
                    try 
                    {
                        audioInputStream = AudioSystem.getAudioInputStream(new File(fileName));
                        curClip = AudioSystem.getClip();

                        curClip.open(audioInputStream); //Opens Stream
                        curClip.start();

                        Thread.sleep(curClip.getMicrosecondLength() / 1000); //Pauses the thread
                        audioInputStream.close();
                        curClip.close();
                    }
                    catch(Exception ex)
                    {
                        ex.printStackTrace();
                    }
                }
            }).run();

    }
}

Класс аниматора, вызывающий метод Audio

        Timer t1 = new Timer(background_Intro_Speed, new ActionListener() 
        {
            public void actionPerformed(ActionEvent e) 
            {
                System.out.println(isShowing());
                if(isShowing())
                {
                    System.out.println(audioOver);
                    if(audioOver && animated.xPosition <= 905)
                        animated.xPosition += 5;
                    else if(animated.xPosition > 905 && audioOver)
                    {
                        System.out.println("Animation Ended");
                        swapPanel();
                    }
                    else if(!audioOver)
                    {
                        new Thread(new Runnable() 
                        {           
                            public void run() 
                            {
                                System.out.println("In Thread");
                                AudioManager.playSound("foo.wav");
                                audioOver = true;
                            }
                        }).run();

                    }
                }
            }
        });
        t1.start(); 

1 Ответ

1 голос
/ 26 апреля 2019
}).run();

Ваша тема не является темой.Вы просто выполняете метод run () потока.

Код должен быть:

}).start();

, чтобы запустить отдельный поток, чтобы код не выполнялся в потоке диспетчеризации событий..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...