我在按照系统时间正确调用函数时遇到问题。我的主要目的是为我的“炸弹人”物体提供更好的运动效果。不幸的是,它表现得很奇怪。我相信有一个愚蠢的小错误,但我找不到因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次。如果你帮助我,也许我可以睡觉:)
提前致谢。
答案 0 :(得分:2)
假设您定期使用计时器调用该函数,您的特定问题似乎是您要多次请求系统时间,而不是一次,因此您在三个部分中测试的值会发生变化。
最好在给定的更新时间创建要绘制的元素队列,因为如果只使用大量if
语句而不是OO抽象,代码将变得越来越复杂。
绘制屏幕时,获取一次时间,然后将该时间传递给要绘制的所有元素。这样,所有元素都将彼此同步,并且您在第一个if
的时间与第三个if
的时间不同时没有问题。
所以我让BomberMan实现一个带有draw ( Graphics2D g, long time )
方法的接口,所有动画元素都实现该方法,并且获取和设置方法而不是公共的isImmune字段。 get和set方法更改了sprite的图像数组的值,因此代码不需要知道轰炸机人员所处的任何其他状态。