Animation 在JavaFx中,每次迭代时间轴之后,如何提高动画速度

Animation 在JavaFx中,每次迭代时间轴之后,如何提高动画速度,animation,javafx,Animation,Javafx,我是初学者。我正在做一个简单的2D游戏。在游戏中,一个彩色圆圈穿过彩色矩形障碍物。它必须与颜色相匹配。游戏循环是使用时间线实现的。现在我希望动画的速度随着时间线的每次迭代而增加。也就是说,每次迭代都必须加快矩形的速度。我已经在handle方法中完成了以下代码检查这个网站和其他网站。但它不起作用 double duration = timeline.getCycleDuration().toMillis(); if(duration > 1) {

我是初学者。我正在做一个简单的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(); 
final double frameDuration=16;
最终双迭代持续时间=4000;
final int framesPerIteration=(int)(迭代持续时间/帧持续时间+1);
随机颜色(矩形、圆形、颜色);
时间线=新时间线();
类FrameHandler实现EventHandler{
私钥密码;
私有int帧=1;
公共布尔值丢失=false;
私有无效损失(){
timeline.stop();
restartButton.setVisible(true);
quitButton.setVisible(true);
}
@凌驾
公共无效句柄(ActionEvent事件){
如果(帧==0){
randomizeColors(矩形、圆形、颜色);//迭代完成后更改颜色
}
双倍持续时间=timeline.getCycleDuration().toMillis();
如果(持续时间>1){
持续时间-=100;
timeline.setRate(timeline.getCycleDuration().toMillis()/duration);
}
//如果按下该键,则移动圆圈
如果(代码!=null){
开关(代码){
案例权利:
circle.setCenterX(circle.getCenterX()
+键盘(移动)(增量);;
打破
案例左:
circle.setCenterX(circle.getCenterX()
-键盘(移动)(增量);;
打破
}
}
//移动矩形并检查交点
最终油漆颜色=circle.getFill();
最终双cx=circle.getCenterX();
最终双cy=圆。getCenterY();
最后一个双r2=circle.getRadius()*circle.getRadius();
用于(矩形:矩形){
校正设置(帧*校正最大值/帧写入);
//检查与错误颜色的矩形的交点
if(rect.getFill()!=color){
double dy=Math.min(Math.abs(rect.getY()-cy),
abs(rect.getY()+rect.getHeight()-cy));
dy=dy*dy;
如果(dy>r2){
{
//增加速度();
继续;}//y距离对于交叉点太大
}
如果(cx>=rect.getX()&&cx{
KeyCode code=evt.getCode();
if(frameHandler.code==代码){
frameHandler.code=null;
}
});
timeline.getKeyFrames().add(新的关键帧(Duration.millis(frameDuration),frameHandler));
timeline.setCycleCount(timeline.unfinite);
timeline.play();

设置速率不会修改循环持续时间。
循环次数/(循环次数-100)
是一个常数,您在第一帧时只需加速一次…那么我应该怎么做来增加循环次数?我正在谷歌上搜索解决方案很多…使用我自己的知识…但没有任何帮助