gpt4 book ai didi

java - Java中如何使用swing Timer更好的实现动画

转载 作者:行者123 更新时间:2023-11-30 11:47:43 24 4
gpt4 key购买 nike

我正在使用计时器循环在我的 Java 应用程序上实现动画。目前我正在使用与动画相关的静态变量(开始时间,元素从哪里开始以及它将去哪里)。有没有更简单的方法来做到这一点?我可以在启动计时器时将这些变量作为参数发送吗?

...
import javax.swing.Timer;

public class SlidePuzz2 extends Applet implements MouseMotionListener, MouseListener {
...

static Element animating;
static PieceLoc blank;
static int delta;
static int orig_x;
static int orig_y;
static long timeStart;

Timer aniTimer;

...
public void init() {
...
aniTimer = new Timer(20, new ActionListener() {
public void actionPerformed(ActionEvent evt) {
int dx = (blank.x*piece-orig_x);
int dy = (blank.y*piece-orig_y);
int t = 200;
delta = (int)(System.currentTimeMillis()-timeStart);
if (delta>t) delta=t;
animating.x = orig_x + dx*delta/t;
animating.y = orig_y + dy*delta/t;
repaint();
if (delta==t) {
animating.updateCA();
board.checkCompleted();
aniTimer.stop();
}
}
});
...
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));

blank = board.getBlankPl();
animating = e;
timeStart = System.currentTimeMillis();
orig_x = animating.x;
orig_y = animating.y;

aniTimer.start();
...

最佳答案

感谢@Max 的评论,我找到了解决我自己问题的方法,在我的主 Applet 类中创建了一个扩展 ActionListener 的内部类。

public class AniTimer implements ActionListener {
Element animating;
PieceLoc blank;
int orig_x;
int orig_y;
long timeStart;
int delta;

public AniTimer(Element e, PieceLoc pl) {
animating = e;
blank = pl;
orig_x = animating.x;
orig_y = animating.y;
timeStart = System.currentTimeMillis();
}

public void actionPerformed(ActionEvent evt) {
int dx = (blank.x*piece-orig_x);
int dy = (blank.y*piece-orig_y);
int t = 200;
delta = (int)(System.currentTimeMillis()-timeStart);
if (delta>t) delta=t;
animating.x = orig_x + dx*delta/t;
animating.y = orig_y + dy*delta/t;
repaint();
if (delta==t) {
aniTimer.stop();
animating.updateCA();
board.checkCompleted();
}
}
}

然后,当我想启动动画时,我所做的就是创建一个新的 Timer,并将我的 ActionListener 类的新实例作为第二个参数,然后我可以将与这个特定动画阶段相关的所有重要参数传递给构造函数.

aniTimer = new Timer(20, new AniTimer(e, board.getBlankPl()));
aniTimer.start();

谢谢 Max,我现在开始喜欢上 Java!

关于java - Java中如何使用swing Timer更好的实现动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9182346/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com