假设我有一个主要的 GameLoop
在这个循环中,我有我的游戏更新
我正在处理我的事件以进行每次迭代的 Sprite 碰撞测试
如果碰撞为真,播放音频文件
这是问题发生的地方
音频剪辑将在游戏冻结时快速播放
或者
它会像我想要的那样延迟播放,但除了音频剪辑之外,整个游戏都会停止。
我只是在寻找一些关于线程基本的技巧。据我所知,这将是处理此问题的最佳方法,但我似乎无法使其正常运行。
注意我会在主类上扩展线程,但已经扩展了 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 max 线程在任何时候都在那里