目前我正在使用JavaFX实现Conway的生命游戏。简而言之,在我的类中,在handle()方法中扩展了AnimationTimer,它遍历2D数组中的每个单元格并更新每个位置,然后使用2D数组中的信息绘制到画布。
这完全没问题,但问题是它运行得太快了。你无法真正看到画布上发生了什么。在窗口我有画布和几个按钮。我添加了一个Thread.sleep(1000)来尝试调节每秒的生成/帧数,但这样做会导致窗口无法立即检测到按钮。当没有告诉线程休眠时,按下按钮是完全响应的。
有没有人对如何解决这个问题有任何建议?
答案 0 :(得分:2)
您可以使用Timeline
,这可能更适合此。将周期数设置为Animation.INDEFINITE
,并在更新之间添加KeyFrame
,并将当前handle
实施添加为框架的onFinished
。
final Timeline timeline = new Timeline();
timeline.setCycleCount(Timeline.INDEFINITE);
timeline.getKeyFrames().add(
new KeyFrame(
Duration.seconds(1),
event -> handle()
)
);
timeline.play();
或者,您可以尝试将KeyFrame
的延迟设为零,并使用时间轴的targetFrameRate
,但我个人从未尝试过。
修改:另一个选项是在frameSkip
中保留AnimationTimer
变量:
private int frameSkip = 0;
private final int SKIP = 10;
@Override
public void handle(long now) {
frameSkip++;
if (frameSkip <= SKIP) {
// Do nothing, wait for next frame;
return;
}
// Every SKIP frames, reset frameSkip and do animation
frameSkip = 0;
// Do animation...
}