JavaFX - объект анимации временной шкалы не отображается? - PullRequest
0 голосов
/ 06 декабря 2018

Я новичок в JavaFX, и я уверен, что здесь что-то упущено.Я пытаюсь сделать анимацию машины, которая едет слева направо через окно, оборачиваясь вокруг правой стороны, когда она туда попадает.Пользователь должен иметь возможность нажимать вверх / вниз, чтобы настроить скорость анимации.У меня была анимация, когда я использовал PathTransition объект, но обнаружил, что вы не можете отрегулировать Duration для PathTransition, поэтому я переделал его в Timeline.

с помощью Timeline, однако, я застрял.Автомобиль не отображается на экране, когда я запускаю приложение.Вот, что я надеюсь, это краткий фрагмент кода:

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

}

И RaceCarPane:

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 объект и использовать его RateProperty, связанный с SimpleDoubleProperty.Хотя, может быть, это и не то, что проект искал в качестве решения, оно помогает, так что я счастлив!

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

@ swpalmer был прав, говоря, что вы не должны добавлять его повторно.

Кроме того, вы определенно можете использовать PathTransition, используя Animation.rateProperty() (PathTransition extendsAnimation).

Кроме того, из PathTransition:

Этот переход создает анимацию пути, охватывающую его продолжительность.Перевод по пути выполняется путем обновления переменных translateX и translateY узла, а переменная вращения будет обновляться, если для ориентации установлено значение OrientationType.ORTHOGONAL_TO_TANGENT,с регулярным интервалом.

Поэтому, если вы используете Timeline, вам также следует установить translateX и translateY всего узла (то есть RaceCarPane) для выполнения анимации;Попытка многократного добавления полигонов - определенно неправильный подход.Если вы также добавляли много полигонов, когда использовали PathTransition, вы, вероятно, делали это не совсем правильно.Даже если анимация оказывается визуально правильной, это не всегда означает, что она сделана правильно.

0 голосов
/ 06 декабря 2018

Похоже, вы пропустили закрывающую скобку в методе рисования.

Есть несколько вещей, которые "не верны".С одной стороны, вы не должны создавать новые объекты и добавлять их в график сцены каждый раз, когда вы хотите переместить свой автомобиль.Вы также не указали, как вы используете originX, originY.

Я предлагаю вам использовать группу для хранения деталей автомобиля.Добавьте его один раз в RaceCarPane и используйте преобразование для группового объекта, чтобы переместить его.

Это, вероятно, будет проще, если вы будете использовать AnimationTimer вместо временной шкалы, особенно если вы хотите иметь возможность динамическиотрегулируйте скорость автомобиля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...