Как увеличить скорость анимации после каждой итерации временной шкалы в JavaFx - PullRequest
0 голосов
/ 28 июня 2018

Я новичок. Я делаю простую 2D-игру. В игре красочный круг проходит через разноцветные прямоугольные препятствия. Это должно соответствовать цветам. Игровой цикл реализован с использованием временной шкалы. Теперь я хочу, чтобы скорость анимации увеличивалась для каждой итерации временной шкалы. То есть прямоугольники должны приходить быстрее для каждой итерации. Я сделал следующий код внутри метода handle, проверяя этот сайт и другие. Но это не работает.

double duration = timeline.getCycleDuration().toMillis();

               if(duration > 1) {
                   duration -= 100;

timeline.setRate(timeline.getCycleDuration().toMillis()/duration);
            }

как я могу это реализовать? Я проверил все сообщения на этом сайте и не смог реализовать это. Вот мой полный код.

    final double frameDuration = 16;
    final double iterationDuration = 4000;
    final int framesPerIteration = (int) (iterationDuration / frameDuration + 1);
    randomizeColors(rectangles, circle, colors);

    Timeline timeline = new Timeline();


    class FrameHandler implements EventHandler<ActionEvent> {

        private KeyCode code;
        private int frame = 1;
        public boolean lost = false;

        private void lostAction() {
            timeline.stop();
            restartButton.setVisible(true);
            quitButton.setVisible(true);
        }

        @Override
        public void handle(ActionEvent event) {
            if (frame == 0) {
                randomizeColors(rectangles, circle, colors); // change colors when iteration is done
            }

            double duration = timeline.getCycleDuration().toMillis();

               if(duration > 1) {
                   duration -= 100;
                 timeline.setRate(timeline.getCycleDuration().toMillis()/duration);
            }


            // move circle, if key is pressed
            if (code != null) {
                switch (code) {
                    case RIGHT:
                        circle.setCenterX(circle.getCenterX()
                                + KEYBOARD_MOVEMENT_DELTA);
                        break;
                    case LEFT:
                        circle.setCenterX(circle.getCenterX()
                                - KEYBOARD_MOVEMENT_DELTA);
                        break;
                }
            }

            // move rects & check intersection
            final Paint color = circle.getFill();
            final double cx = circle.getCenterX();
            final double cy = circle.getCenterY();
            final double r2 = circle.getRadius() * circle.getRadius();
            for (Rectangle rect : rectangles) {
                rect.setY(frame * RECT_MAX_Y / framesPerIteration);
                // check for intersections with rects of wrong color
                if (rect.getFill() != color) {

                    double dy = Math.min(Math.abs(rect.getY() - cy),
                            Math.abs(rect.getY() + rect.getHeight() - cy));
                    dy = dy * dy;

                    if (dy > r2) {
                        {
                            //increaseSpeed();
                            continue;} // y-distance too great for intersection
                    }
                    if (cx >= rect.getX() && cx <= rect.getX() + rect.getWidth()) {
                        lost = true;
                    } else {
                        double dx = Math.min(Math.abs(rect.getX() - cx),
                                Math.abs(rect.getX() + rect.getWidth() - cx));
                        if (dx * dx + dy <= r2) {
                            lost = true;
                        }
                    }
                }
            }
            frame = (frame + 1) % framesPerIteration;
            if (lost) {
                lostAction();
            }
        }
    }

    FrameHandler frameHandler = new FrameHandler();

    Scene scene = new Scene(root);// keep track of the state of the arrow keys
    scene.setOnKeyPressed(evt -> {
        KeyCode code = evt.getCode();
        switch (code) {
            case RIGHT:
            case LEFT:
                frameHandler.code = code;
                break;
        }
    });
    scene.setOnKeyReleased(evt -> {
        KeyCode code = evt.getCode();
        if (frameHandler.code == code) {
            frameHandler.code = null;
        }
    });

    timeline.getKeyFrames().add(new KeyFrame(Duration.millis(frameDuration), frameHandler));
    timeline.setCycleCount(Timeline.INDEFINITE);
    timeline.play(); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...