Скажем, у меня есть основной GameLoop
Внутри этого цикла у меня есть обновления игры
Я обрабатываю свои события для тестирования столкновений спрайтов с каждой итерацией
Если столкновение верно, воспроизвести аудиофайл
Вот где возникает проблема
Аудиоклип будет воспроизводиться быстро, пока игра зависла.
or
Он будет воспроизводиться с задержкой, как я хочу, но вся игра останавливается, кроме аудиоклипа.
Мне просто нужны советы по многопоточности. Насколько мне известно, это будет лучший способ справиться с этой проблемой, и я не могу заставить его работать правильно.
Примечание. Я бы расширил Thread в основном классе, но уже расширяет Canvas, что необходимо.
public Main()
{
boolean running = true;
while(running)
{
// check for collision (returns boolean)
// if true proceed to execute Entity.doLogic()
// this then activates the AudioClip class' .playAudioClip(this, path)
// the audio Clip is then played and once it's done it'll return
// returns and instantly goes back to playing again
// meanwhile the loop Freezes up on me.
}
}
И это настоящий Sound.class
public class Sounds
{
public void startSound()
{
String path = "path";
playAudioClip(game, path);
}
public void playAudioClip(String path)
{
try
{
Clip clip = AudioSystem.getClip();
clip.open(AudioSystem.getAudioInputStream(new File(path)));
clip.start();
}
catch(Exception e)
{
System.out.println("Problem loading audio file");
}
try{Thread.sleep(500);}catch(Exception ex){System.out.println("Problem with Sleep");};
}
}
Я пробовал приведенную ниже и ту же ситуацию (вызов ее с помощью s.start() и s.run() без разницы), использование .start() вызовет ошибку в потоке, быстро воссоздает и поделится)
public class Sounds extends Thread
{
@Override
public void run()
{
String path = "path";
playAudioClip(game, path);
}
public void playAudioClip(String path)
{
try
{
Clip clip = AudioSystem.getClip();
clip.open(AudioSystem.getAudioInputStream(new File(path)));
clip.start();
}
catch(Exception e)
{
System.out.println("Problem loading audio file");
}
try{Thread.sleep(500);}catch(Exception ex){System.out.println("Problem with Sleep");};
}
}
выдает на консоль «java.lang.IllegalThreadStateException», вызывая с помощью start() только определение run() внутри этого объекта
Примечание для себя. Не делай этого.
Неправильная многопоточность. Яркий пример: 243 максимальных потока, идущих в любой момент.