【问题标题】:Calling function according to system time根据系统时间调用函数
【发布时间】:2010-12-29 09:23:59
【问题描述】:

我无法根据系统时间正确调用函数。我的主要目的是为我的“炸弹人”对象提供更好的运动效果。不幸的是,它的行为很奇怪。我相信有一个愚蠢的小错误,但由于失眠30小时我找不到。这是我的代码:

                if (System.currentTimeMillis() % 600 <= 200) {
                    if (!gEngine.gMap.bomber.isImmune) {
                        gEngine.gMap.bomber.setImage("bomberman_up3.gif");
                    } else {
                        gEngine.gMap.bomber.setImage("bomberman_red_up3.gif");
                    }
                } else if (System.currentTimeMillis() % 600 <= 400) {
                    if (!gEngine.gMap.bomber.isImmune) {
                        gEngine.gMap.bomber.setImage("bomberman_up2.gif");
                    } else {
                        gEngine.gMap.bomber.setImage("bomberman_red_up2.gif");
                    }


                } else if (System.currentTimeMillis() % 600 >= 400)
                {
                    if (!gEngine.gMap.bomber.isImmune) {
                        gEngine.gMap.bomber.setImage("bomberman_up1.gif");
                    } else {
                        gEngine.gMap.bomber.setImage("bomberman_red_up1.gif");
                    }
                }

顺便说一句,我很确定奇怪不是关于 gif 图像的顺序。代码应每秒更改图像 3 次。如果你帮助我,也许我可以睡觉。 :)

提前致谢。

【问题讨论】:

  • setImage是如何实现的?假设您使用的是 Swing,您是否在 EDT 中,例如通过使用 SwingWorker.invokeLater()?

标签: java algorithm time conditional


【解决方案1】:

假设您使用计时器定期调用该函数,您的特定问题似乎是您多次请求系统时间,而不是一次,因此您在三个部分中测试的值会发生变化。

您最好创建一个元素队列以在给定的更新时间使用,因为如果您只使用大量 if 语句而不是 OO 抽象,您的代码最终会变得越来越复杂。

绘制屏幕时,获取一次时间,并将该时间传递给所有要绘制的元素。这样,所有元素将彼此同步,并且您不会遇到第一个 if 的时间与第三个 if 的时间不同的问题。

所以我会让 BomberMan 实现一个带有 draw ( Graphics2D g, long time ) 方法的接口,所有动画元素都实现该方法,并使用 get 和 set 方法而不是公共的 isImmune 字段。 get 和 set 方法更改 sprite 的图像数组的值,因此代码不需要知道炸弹人所处的任何其他状态。

【讨论】:

  • 非常感谢。我想我理解我的问题。我更正了获取时间部分,现在它好多了,但仍然不完美。我可能会尝试为此找到另一种解决方案。并感谢 OOP 提示。我会考虑的。
猜你喜欢
  • 1970-01-01
  • 2011-02-09
  • 2017-12-09
  • 1970-01-01
  • 2011-10-12
  • 1970-01-01
  • 2012-06-25
  • 1970-01-01
  • 2020-09-17
相关资源
最近更新 更多