我正在用Java创建一个简单的棋盘游戏,使用的是Swing和一个AI,它应该在用户轮到他们之后才会轮到它。我想“暂停”游戏大约3秒,然后才允许AI轮换,这样用户就可以看到他们移动的结果。调用Thread.sleep(3000)也会暂停我使用三叉树动画库创建的动画。在三秒钟结束后,空格就变成了它们应该是的颜色,根本没有做动画。
如果有人能提供任何建议,请提出来。我知道我总是可以添加一个"Continue“按钮,用户可以在AI开始之前按下它,但我想避免这一步。
编辑:这是我的单人游戏面板。它扩展了GamePanel,这只是一个抽象类,它提供了一种根据当前板子更新图形用户界面的方法。它还扩展了JPanel。我想我只是有点不清楚在哪里/如何实现计时器来做我想要它做的事情,无论它是在这个类中还是在另一个类中。
发布于 2012-05-13 04:39:33
假设您正在单独的线程中运行AI代码(您不希望在运行复杂的AI时锁定UI,对吧?),您希望暂停发生在AI线程中,而不是UI线程中。在这里添加您的Thread.sleep()。
如果你目前没有为AI使用单独的线程,这听起来并没有你想要的那么“简单”,可以看看使用Futures and Callables,这是一种执行后台操作和链接事件的好方法,当它们完成时发生。
发布于 2012-05-13 04:31:56
切勿在Swing事件线程或EDT上调用Thread.sleep(),因为这会占用该线程,阻止Swing执行任何图形操作或与用户交互。请改用Swing Timer。例如,
int delay = 3000;
new Timer(delay , new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// tell AI to do its thing
((Timer)e.getSource()).stop();
}
}).start();有关Swing事件分派线程或EDT的更多信息,请阅读:Concurrency in Swing
https://stackoverflow.com/questions/10567178
复制相似问题