根据系统时间调用功能

时间:2010-12-29 09:24:00

标签: java algorithm time conditional

我在按照系统时间正确调用函数时遇到问题。我的主要目的是为我的“炸弹人”物体提供更好的运动效果。不幸的是,它表现得很奇怪。我相信有一个愚蠢的小错误,但我找不到因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次。如果你帮助我,也许我可以睡觉:)

提前致谢。

1 个答案:

答案 0 :(得分:2)

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

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

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

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