JavaFX-时间轴动画对象不显示?

时间:2018-12-05 21:28:13

标签: java javafx

我是JavaFX的新手,我确定这里缺少明显的东西。 我正在尝试制作一辆汽车的动画,该动画从左到右穿过窗户,到达时环绕在右侧。用户应该能够上下拖动来调整动画的速度。使用PathTransition对象时动画播放了,但是发现您无法调整Duration的{​​{1}},所以我在PathTransition中重新设置了动画。

尽管如此,我被Timeline困住了。启动应用程序时,汽车不显示在屏幕上。我希望这是一个简洁的代码段:

Timeline

还有RaceCarPane:

public class Project12 extends Application {

public static void main(String[] args) {
    launch();
}

@Override
public void start(Stage primaryStage) {     
    //Create Pane to hold the car animation
    Pane pane = new Pane();

    //Create the RaceCarPane
    RaceCarPane raceCar = new RaceCarPane();
    pane.getChildren().add(raceCar); //Adds the race car to the main pane

    //Create the VBox to hold components
    VBox displayPane = new VBox();
    displayPane.getChildren().addAll(pane, userInstructions, btnPause);
    displayPane.setSpacing(15);
    displayPane.setAlignment(Pos.CENTER);

    //Create scene for display and add the display pane
    Scene scene = new Scene(displayPane);

    //Add the scene to the stage and display
    primaryStage.setTitle("Project 12");
    primaryStage.setResizable(false); //disable resizing of the window
    primaryStage.setScene(scene);
    primaryStage.show();

}

编辑:根据@Jai在下面的评论,我的解决方案是还原为public class RaceCarPane extends Pane { //Declare origin for determining polygon point locations private double originX = 10; private double originY = getHeight() - 10; private Timeline carAnimation; //Set the Timeline for the car in constructor method public RaceCarPane() { carAnimation = new Timeline( new KeyFrame(Duration.millis(100), e -> moveCar())); carAnimation.setCycleCount(Timeline.INDEFINITE); carAnimation.play(); } private void paint() { //Create a polygon for the body Polygon body = new Polygon(); body.setFill(Color.BLUE); body.setStroke(Color.DARKBLUE); //Add points to the body ObservableList<Double> bodyList = body.getPoints(); /*(code omitted, just adding coordinates to the ObservableList for all parts. I don't believe the bug is here since it displayed when I was using a PathTransition animation)*/ //Add to pane getChildren().addAll(body, roof, frontWheel, rearWheel); } public void setOrigin (double x, double y) { this.originX = x; this.originY = y; } @Override public void setWidth(double width) { super.setWidth(width); paint(); } @Override public void setHeight(double height) { super.setHeight(height);; paint(); } public void moveCar() { //Check that car is in bounds if(originX <= getWidth()) { originX += 10; paint(); } else { originX = 0; paint(); } 对象,并使用绑定到PathTransition的{​​{1}}对象。虽然可能不是该项目寻求的解决方案,但它可以解决问题,所以我很高兴!

2 个答案:

答案 0 :(得分:0)

您似乎错过了paint方法中的右括号。

有些错误的地方。首先,您不应该在每次要移动汽车时都创建新对象并将其添加到场景图中。您;还省略了如何使用originX,originY。

我建议您使用组来固定汽车零件。将其添加到RaceCarPane一次,并在组对象上使用变换将其移动。

如果您基于AnimationTimer而不是时间轴,这可能会更容易,尤其是如果您希望能够动态调整汽车的速度。

答案 1 :(得分:0)

@swpalmer正确地说您不应重复添加。

此外,您绝对可以通过使用Animation.rateProperty()PathTransition扩展PathTransition)来使用Animation

另外,来自PathTransition

  

此过渡创建一个跨越其持续时间的路径动画。的   通过更新 translateX 完成沿路径的翻译,   节点的 translateY 变量,旋转变量将获得   如果方向设置为,则更新   OrientationType.ORTHOGONAL_TO_TANGENT,按固定的时间间隔。

因此,如果您使用的是Timeline,还应该设置整个节点(即translateX)的translateYRaceCarPane来执行动画;尝试重复添加多边形绝对是错误的方法。如果在使用PathTransition时还添加了许多多边形,那么您可能做得也不太正确。即使动画在视觉上是正确的,也并不总是意味着它做得正确。