在没有循环依赖的情况下提高 JavaFX KeyFrame 速度?

时间:2021-03-12 08:48:14

标签: java javafx

我正在尝试使用 JavaFX 创建 Snake 克隆。游戏的要求之一是拥有一种可以增加蛇的速度的能量食物。

对于我的游戏循环,我使用带有单个 TimelineKeyFrame,它充当游戏滴答。每个游戏对象都被渲染到一个 Canvas 上。

蛇在 21x21 的网格中移动,每个单元格的长度为 40 像素。在我的实现中,蛇每刻移动一个单元格(按设计)。每个身体部分基本上在当前方向上移动 40px。这意味着蛇的速度由游戏的滴答持续时间决定。

为了增加蛇的速度,我必须改变关键帧的持续时间,这会更新游戏状态并绘制到画布上。为此,我停止时间轴,移除关键帧,然后添加一个持续时间较短的新关键帧。

问题是,为了做到这一点,我必须从它的依赖项之一(例如 Game 类)调用包含游戏循环的 State 类中的一个方法.

private final Timeline loop = new Timeline();
    public void setGameSpeed(GameSpeed speed) {
        createLoop(speed.value);
    }
    private void createLoop(double duration) {
        if (loop.getStatus().equals(RUNNING)) {
            loop.stop();
        }

        if (loop.getKeyFrames().size() > 0) {
            loop.getKeyFrames().removeAll(loop.getKeyFrames());
        }

        loop.getKeyFrames().add(new KeyFrame(Duration.seconds(duration), e -> {
            state.update();
            renderer.draw();
        }));
        loop.play();
    }

到目前为止,我想出了两个解决方案。我可以将时间轴和相关方法设为静态,也可以将“游戏”的实例传递给相应的依赖项。

有没有更优雅的方法来做到这一点?

1 个答案:

答案 0 :(得分:0)

一种选择是利用回调将委托方法传递给 State。或者类似地使用观察者模式来通知 Game 导致调用相应方法的状态更改。

另一种选择是让 Game 定期读取 State 的属性以了解何时更改游戏速度。这样 State 就不会知道 Game