【问题标题】:Java does something for 15 seconds and then something else 5 sec afterJava 做某事 15 秒,然后 5 秒后做其他事
【发布时间】:2016-05-08 20:28:41
【问题描述】:

所以我想实现一个计时器,它允许我每 15 秒绘制一个红色方块,然后在它存在 5 秒后让方块从画布上消失。这是我想要实现的游戏中的一个陷阱,但不确定计时器将如何工作。

我想我需要 2 个计时器,一个用于出现,第二个用于消失(?),但我不确定如何同步它们,以便方块出现并在 15 秒内停留在画布的某个位置 5 秒任何一个。 (在随机的 15-20 秒增量中使用它可能会更好)。重要的是,在我将画布从红色变为白色后,此项目会消失。

如何在函数中调用计时器?我需要为此开设一个新课程吗?一个实例变量就够了吗?

【问题讨论】:

  • 您可以使用单个计时器,但是,引擎会知道下一个陷阱应该何时显示(或它最后一次显示的时间)并知道何时应该隐藏它
  • 重点是,您可以拥有多个由单个计时器管理的“事件”。请记住,更多的线程/定时器并不等于更好的性能;)

标签: java timer


【解决方案1】:

我们遗漏了一些重要的细节(比如您使用的是哪个框架),但基本的想法是......

  • 拥有一个“主循环”,负责更新游戏状态并安排 UI 更新
  • 有一个List 的“事件”,它们被设计为在给定的时间点触发,让“主循环”检查这些事件(可能按时间排序以提高迭代效率)和根据当前时间和事件时间触发需要触发的事件(这显然会从List中删除事件)

事件可以创建新事件,例如,当您的活板门事件被触发时,它可能会在未来 5 秒内触发“移除”事件。同样,当触发remove事件时,如果可以触发一个新的“trap door”事件

这样,您可以随机出现任意数量的活板门。

请记住,更多线程/计时器并不等同于更好的性能,而且还会增加问题的整体复杂性,因为您需要进行一系列检查以确保一切保持同步

【讨论】:

  • 有人愿意指出否决票的原因吗?它在哪些方面不回答 ops 问题?在哪些方面可以改进?显然我们不应该尝试帮助人们。由于您选择不对问题或其他答案投反对票,因此我只能假设您是个混蛋
【解决方案2】:

作为一个 java 图形应用程序,我只会创建 SwingWorker 的实例并在需要时触发它。每个 SwingWorker 都会以适当的睡眠调用 (https://docs.oracle.com/javase/tutorial/essential/concurrency/sleep.html) 开始。查看 Swing 文档以创建在后台运行的适当 SwingWorker,等待并稍后执行您需要的任务 (https://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html)。

【讨论】:

  • 或摆动计时器,因为从内部与 EDT 交互是安全的
  • 那更好,我不知道那个! :)
【解决方案3】:

您可以创建一个新线程来使所有计时器工作。

但是这个段放到需要定时器的地方:

new Thread(new Runnable()) {
@override
public void run() {
   while(true) {

     // do the drawing stuff

     try {
        sleep(5000); // make the thread wait 5000 microsecs = 5s
     } catch (InterruptedException ex) {}

     // do deleting stuff

     try {
        sleep(15000); 
     } catch (InterruptedException ex) {}
   }

这会启动一个新线程,重复执行创建、等待、删除和等待过程。

【讨论】:

  • 我并不完全相信这将如何工作,但我肯定会在评论部分添加他们应该考虑使用 invokeLater 以便以线程安全的方式更改 Canvas (javarevisited.blogspot.com.es/2011/09/… )
  • 请记住,大多数 gui 框架都不是很安全,这可能会导致严重的同步问题
  • @MadProgrammer 没错……我忘记了 Swing 不是线程安全的。虽然如果您实现自己的 Runnable 并将其传递给 invokeLater(),它工作正常
猜你喜欢
  • 2015-11-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-18
  • 1970-01-01
  • 2014-03-13
  • 1970-01-01
  • 2017-09-08
  • 1970-01-01
相关资源
最近更新 更多