当前位置: 首页 > 知识库问答 >
问题:

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

韦志新
2023-03-14

我是JavaFX新手,我确信我在这里遗漏了一些明显的东西。我试图制作一个汽车的动画,它从左到右穿过一扇窗户,到达那里时绕着右边。用户应该能够点击up/down来调整动画的速度。当我使用一个路径转换对象时,动画开始运行,但发现你无法调整路径转换持续时间,所以我在一个时间线中重新编辑了它。

然而,随着时间的推移,我被卡住了。当我启动应用程序时,汽车不会显示在屏幕上。以下是我希望的一段简洁的代码片段:

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();

}

还有消旋果烷:

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();
        }

编辑:根据@Jai下面的评论,我的解决方案是恢复到PathTransition对象并使用其绑定到SimpleDoublePropertyRateProperty。虽然可能不是项目想要的解决方案,但它确实有用,所以我很高兴!

共有2个答案

缪英锐
2023-03-14

看起来你在油漆方法中错过了一个结束括号。

有几件事是“错误的”。首先,你不应该每次想移动你的车时都创建新对象并将它们添加到场景图中。你;我还遗漏了你如何使用原始X,原始Y。

我建议你用一个小组来保管汽车的零件。将其添加到RaceCarPane中一次,然后使用组对象上的变换来移动它。

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

傅翰池
2023-03-14

@swpalmer说你不应该重复添加它是对的。

除此之外,您完全可以通过使用动画来使用路径转换。rateProperty()。

此外,来自PathTransition

此过渡将创建跨越其持续时间的路径动画。沿着路径的平移是通过更新节点的translateXtranslateY变量来完成的,如果方向设置为orientation Type,旋转变量将得到更新。以规则间隔正交于切线。

因此,如果您使用的是时间线,则还应设置整个节点(即RaceCarPane)的translateXtranslateY)来执行动画;反复尝试添加多边形肯定是错误的方法。如果在使用PathTransition时也添加了很多多边形,那么可能也做得不对。即使动画在视觉上是正确的,也并不总是意味着它是正确的。

 类似资料:
  • 我想知道为什么我的图表每次移动后屏幕都不清晰。这是我的代码: MainClass,我想删除其中的“时间”,并将其放在绘图方法updateScene中的lambda表达式中,但还不知道如何做到这一点:/ Axes类描述如何绘制轴: 缩放和绘制图表中我需要的一切。 绘图课负责制作动画,精确绘制我想要的图形。 屏幕显示我编译后得到的内容。就像我自上而下的问题一样,不知道是什么原因导致在每个时间线阶段后不

  • 我一直试图在我的UI中添加一个动画到我的气泡图中,但遇到了一些问题。我试图在不同的阶段增加气泡的大小,以显示渐变,但它只是画出它的全部大小,而不是在每个阶段。 体育推特计数是泡沫的最终值,我将其除以不同的数量,以显示最终值的建立。 有人有什么想法为什么这不像我期望的那样工作吗?

  • 在一个区域表面上有很多图像。我把它们分成小组。它们应该水平滚动成链。在这里输入图像描述 我写了一些方法来工作。例如。在左边切换位置。(rects-rectangles。早先是rectangles)。 例如。将元素从中心移到左边。 等等。

  • 我目前正在创建一个非常简单的JavaFX程序,模拟城市之间运送乘客的飞机和船只。到目前为止,我已经能够让飞机在几个城市进行短途飞行,但问题是,当我添加超过3或4架飞机时,动画速度非常慢。 我正在做的是使用Timeline类作为我的主游戏循环,清除并重新绘制画布上每帧60帧的平面图像。以下是时间表部分: 以下是我如何为平面创建新线程: 这是Plane类中定义的run()方法: 我知道代码非常混乱,但

  • 问题内容: 我要在当前时间之前的某个时间创建一个新的日期对象。如果我要在今天前1天放映,效果很好。但如果我想在30天前放映,那将是未来(?) 输出: 这里有什么限制?达到长期限制? 问题答案: 文字中的整数溢出, 在您的情况下,以前对文字进行求值,结果为负,然后分配给 这导致 转换成 注意:将其文字化,然后相乘 更好地使用类进行操作