1

我正在使用带有 AI 的 Swing 用 Ja​​va 创建一个简单的棋盘游戏,该 AI 应该在用户轮到他们之后轮到它。我想在让 AI 轮到它之前让游戏“暂停”大约 3 秒钟,以便用户可以看到他们移动的结果。调用 Thread.sleep(3000) 也会暂停我使用 Trident 动画库创建的动画。三秒结束后,空间只是变成了它们应该是的颜色,根本没有动画。

如果有人可以提供任何建议,请提供。我知道我总是可以添加一个“继续”按钮,用户可以在 AI 轮到它之前按下该按钮,但我想避免这一步。

编辑:这是我的单人游戏面板。它扩展了 GamePanel,它只是一个抽象类,具有基于当前板更新 GUI 的方法。它还扩展了 JPanel。我想我只是有点不清楚在哪里/如何实现计时器来做我想做的事情,无论是在这个班级还是另一个班级。

4

2 回答 2

4

永远不要调用Thread.sleep()Swing 事件线程或 EDT,因为这会占用该线程,从而阻止 Swing 执行任何图形或与用户交互。请改用摇摆计时器。例如,

  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 的更多信息,请阅读:Swing 中的并发

于 2012-05-12T20:31:55.507 回答
1

假设您无论如何都在单独的线程中运行 AI 代码(您不想在运行复杂的 AI 内容时锁定 UI,对吗?),您希望暂停发生在 AI 线程中,而不是 UI 线程中。在那里添加你的 Thread.sleep() 。

如果您当前没有为 AI 使用单独的线程,并且这听起来不像您预期​​的那么“简单”,请查看使用Futures 和 Callables,这是一种执行后台操作和链接事件的好方法,当它们发生时完全的。

于 2012-05-12T20:39:32.983 回答