我正在尝试使用 JavaFX 创建 Snake 克隆。游戏的要求之一是拥有一种可以增加蛇的速度的能量食物。
对于我的游戏循环,我使用带有单个 Timeline
的 KeyFrame
,它充当游戏滴答。每个游戏对象都被渲染到一个 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();
}
到目前为止,我想出了两个解决方案。我可以将时间轴和相关方法设为静态,也可以将“游戏”的实例传递给相应的依赖项。
有没有更优雅的方法来做到这一点?
答案 0 :(得分:0)
一种选择是利用回调将委托方法传递给 State
。或者类似地使用观察者模式来通知 Game
导致调用相应方法的状态更改。
另一种选择是让 Game
定期读取 State
的属性以了解何时更改游戏速度。这样 State
就不会知道 Game
。