JavaFX 动画西蒙说,无法确定时间
JavaFX animating simon says, cant figure out timing
我正在用 javaFX 编写一个 simon says 游戏,我遇到了动画序列的问题。我不知道如何对按钮的动画进行排队(这是突出显示的弧线)
if (mootor.isArvutiKäik()){
mootor.genereeriuus();
for(int i = 0; i < mootor.getJärjend().size(); i++){
if(mootor.getJärjend().get(i)==0){
punane.setFill(Color.RED);
Timeline timeline = new Timeline(new KeyFrame(
Duration.millis(500),
ae -> punane.setFill(Color.RED.darker())));
timeline.play();
} else if (mootor.getJärjend().get(i)==1) {
roheline.setFill(Color.GREEN.brighter());
Timeline timeline = new Timeline(new KeyFrame(
Duration.millis(500),
ae -> roheline.setFill(Color.GREEN)));
timeline.play();
} else if (mootor.getJärjend().get(i)==2) {
sinine.setFill(Color.BLUE);
Timeline timeline = new Timeline(new KeyFrame(
Duration.millis(500),
ae -> sinine.setFill(Color.BLUE.darker())));
timeline.play();
} else {
kollane.setFill(Color.YELLOW);
Timeline timeline = new Timeline(new KeyFrame(
Duration.millis(500),
ae -> kollane.setFill(Color.YELLOW.darker())));
timeline.play();
}
PauseTransition test = new PauseTransition(Duration.millis(500));
test.play();
}
//mootor.setArvutiKäik(false);
}
该代码生成一个从 0 到 3 的整数,并根据该整数突出显示与该数字对应的弧线。然而,现在,所有生成的整数和弧线都会同时突出显示。
我看到提到 platform.runlater(或类似的东西),但我不知道如何使用它。
感谢您的宝贵时间!
Animation
将在您调用 play
方法后立即启动。由于循环运行的时间比动画应该等待的时间短,所有事件(几乎)同时发生。
您可以使用 SequentialTransition
按顺序播放 Animation
。
以下代码演示了一种重复更改 Rectangle
颜色的方法:
@Override
public void start(Stage primaryStage) {
Rectangle rect = new Rectangle(50, 50);
Button btn = new Button("start");
btn.setOnAction((ActionEvent event) -> {
SequentialTransition sequence = new SequentialTransition();
List<Color> colors = Arrays.asList(Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW);
for (Color color : colors) {
PauseTransition transition = new PauseTransition(Duration.millis(500));
transition.setOnFinished(evt -> rect.setFill(color));
sequence.getChildren().add(transition);
}
sequence.play();
});
Scene scene = new Scene(new VBox(rect, btn));
primaryStage.setScene(scene);
primaryStage.show();
}
然而,在您的情况下,您可以简单地将所有 KeyFrame
添加到同一个 Timeline
动画中,对所有 KeyFrame
使用不同的值。您可以简单地使用 Duration.millis(1000*i + 500)
作为颜色变化的时间。
我正在用 javaFX 编写一个 simon says 游戏,我遇到了动画序列的问题。我不知道如何对按钮的动画进行排队(这是突出显示的弧线)
if (mootor.isArvutiKäik()){
mootor.genereeriuus();
for(int i = 0; i < mootor.getJärjend().size(); i++){
if(mootor.getJärjend().get(i)==0){
punane.setFill(Color.RED);
Timeline timeline = new Timeline(new KeyFrame(
Duration.millis(500),
ae -> punane.setFill(Color.RED.darker())));
timeline.play();
} else if (mootor.getJärjend().get(i)==1) {
roheline.setFill(Color.GREEN.brighter());
Timeline timeline = new Timeline(new KeyFrame(
Duration.millis(500),
ae -> roheline.setFill(Color.GREEN)));
timeline.play();
} else if (mootor.getJärjend().get(i)==2) {
sinine.setFill(Color.BLUE);
Timeline timeline = new Timeline(new KeyFrame(
Duration.millis(500),
ae -> sinine.setFill(Color.BLUE.darker())));
timeline.play();
} else {
kollane.setFill(Color.YELLOW);
Timeline timeline = new Timeline(new KeyFrame(
Duration.millis(500),
ae -> kollane.setFill(Color.YELLOW.darker())));
timeline.play();
}
PauseTransition test = new PauseTransition(Duration.millis(500));
test.play();
}
//mootor.setArvutiKäik(false);
}
该代码生成一个从 0 到 3 的整数,并根据该整数突出显示与该数字对应的弧线。然而,现在,所有生成的整数和弧线都会同时突出显示。 我看到提到 platform.runlater(或类似的东西),但我不知道如何使用它。
感谢您的宝贵时间!
Animation
将在您调用 play
方法后立即启动。由于循环运行的时间比动画应该等待的时间短,所有事件(几乎)同时发生。
您可以使用 SequentialTransition
按顺序播放 Animation
。
以下代码演示了一种重复更改 Rectangle
颜色的方法:
@Override
public void start(Stage primaryStage) {
Rectangle rect = new Rectangle(50, 50);
Button btn = new Button("start");
btn.setOnAction((ActionEvent event) -> {
SequentialTransition sequence = new SequentialTransition();
List<Color> colors = Arrays.asList(Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW);
for (Color color : colors) {
PauseTransition transition = new PauseTransition(Duration.millis(500));
transition.setOnFinished(evt -> rect.setFill(color));
sequence.getChildren().add(transition);
}
sequence.play();
});
Scene scene = new Scene(new VBox(rect, btn));
primaryStage.setScene(scene);
primaryStage.show();
}
然而,在您的情况下,您可以简单地将所有 KeyFrame
添加到同一个 Timeline
动画中,对所有 KeyFrame
使用不同的值。您可以简单地使用 Duration.millis(1000*i + 500)
作为颜色变化的时间。