【发布时间】:2012-05-30 03:59:02
【问题描述】:
我有(应该是什么)一个简单的问题要解决,我愿意接受其他方法来解决它。我愿意接受其他解决方案。
问题: 我们正在使用 java swing 来显示基于回合、基于图块的游戏的图形。我正在使用带有图标的 jlabels,绝对定位。
为了使运动动画化,我使用了一个摆动计时器,它一次将位置更新 4 个像素,缓慢地向右、向左等移动精灵。
为了实现这一点,我运行了一个计时器,效果非常好。当我尝试向下移动,然后向右移动时,问题就出现了。
精灵向下移动,从不向右移动,如果我通过一些控制台打印来观察执行,可以清楚地看到两个计时器同时运行。我已经在互联网上进行了大量的挖掘工作,但我无法找到一种方法来告诉摆动计时器在第一个计时器停止之前不要执行,如果我尝试忙等待一个计时器完成(糟糕)UI 根本不显示(显然是朝着错误的方向迈出了一步。)
现在我可以完全放弃计时器,要么让精灵传送到它的新位置,要么使用一些糟糕的忙碌等待移动方案,但我希望有好心人有一个解决方案。
简而言之:我需要一种方法来在设定的时间段内运行摇摆计时器,停止它,然后然后启动一个新的计时器,这样它们就不会重叠。最好这种方法允许每个计时器在自己的方法中,然后我可以一个接一个地调用这些方法。
提前感谢您的任何建议。
编辑:扩展的示例代码。如果您的建议需要完整的 scsse,那么很抱歉浪费了您的时间,因为完整的代码是一头野兽。这个示例代码根本不能正常工作,抱歉,但它应该说明这一点。
所以。我们有两个函数,每个函数都有一个运行动画循环的计时器,一个用于向下和向右对角线移动,一个用于直线向下移动。
public class TestClass {
static int counter = 0;
static int counter2 = 0;
static Timer timerC;
static Timer timerX;
public static void main(String[] args) {
moveC();
moveX();
}
public static void moveC() {
int delay = 200; // milliseconds
timerC = new Timer(delay, null);
timerC.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
if (counter < 32) {
counter = counter + 4;
System.out.println("*C*");
} else {
timerC.stop();
System.out.println("*C STOP*");
}
}
});
timerC.start();
}
public static void moveX() {
int delay = 200; // milliseconds
timerX = new Timer(delay, null);
timerX.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
if (counter < 32) {
counter = counter + 4;
System.out.println("*X*");
} else {
timerX.stop();
System.out.println("*X STOP*");
}
}
});
timerX.start();
}
}
我最终希望在这里看到的是
*C*
*C*
*C*
*C*
*C STOP*
*X*
*X*
*X*
*X*
*X STOP*
我真正得到的是
*C*
*X*
*C*
*X*
*C*
*X*
*C*
*X*
*C STOP*
*X STOP*
我在这里试图达到的目的是运行一个动画周期以完成,然后是另一个。
再次感谢。
【问题讨论】: