我正在制作简单的游戏,这是代码:
public class Game extends Canvas implements Runnable {
public void start() {
t = new Thread(this);
t.start();
}
@Override
public void run() {
setVisible(true); // visibility of the thread turn on
while (!t.isInterrupted()) {
if(condition for end the game) {
t.interrupt(); //here i need to destroy the thread
setVisible(false); //visibility to off
}
update();
render();
try {
Thread.sleep(20);
} catch(InterruptedException e) {}
}
}
}
我有另一个扩展JFrame的类,这个类正在引入主菜单,如果我的“结束游戏的条件”为真,线程消失,菜单再次可见,它很好,但如果我想开始新的游戏再次,线程的行为是奇怪的 - 它似乎Thread.sleep()方法从20变为10,因为它的速度更快,可能我需要杀死线程,但我不知道如何,谢谢
答案 0 :(得分:2)
简单,打破循环:
if(condition for end the game) {
t.interrupt(); //here i need to destroy the thread
setVisible(false); //visibility to off
break;
}
结束循环,线程结束。
答案 1 :(得分:0)
终止线程的最简单方法是退出run函数。不需要特殊处理,只需要一个简单的return
即可。
对于您的游戏,您可能需要考虑使用ScheduledExecutorService,它允许您安排Runnable以固定费率运行:
executor.scheduleAtFixedRate(gameLoop, 0, 1000/TARGET_FPS, TimeUnit.MILLISECONDS);
请记住,您需要取出gameLoop的实际循环,因为这是通过固定费率调用完成的,这会将其缩减为:
public void run() {
if (pause == false) {
update();
render();
}
}
如果pause
是一个布尔值,你应该出于某种原因想暂停渲染一段时间。
使用此设置,您只需拨打executor.shutdown()
即可终止游戏,然后停止对runnable的任何进一步调用。
答案 2 :(得分:0)
不是真正的主题,但我也在制作游戏,而且我正在使用Timer(来自swingx):
public class MainGameLoop implements ActionListener{
Timer timer;
public static void main(...){
timer = new Timer(10, this);
timer.start();
}
public void actionPerformed(ActionEvent e) {
...
}
}
对我很好。