Animation 在JavaFx中,每次迭代时间轴之后,如何提高动画速度
我是初学者。我正在做一个简单的2D游戏。在游戏中,一个彩色圆圈穿过彩色矩形障碍物。它必须与颜色相匹配。游戏循环是使用时间线实现的。现在我希望动画的速度随着时间线的每次迭代而增加。也就是说,每次迭代都必须加快矩形的速度。我已经在handle方法中完成了以下代码检查这个网站和其他网站。但它不起作用Animation 在JavaFx中,每次迭代时间轴之后,如何提高动画速度,animation,javafx,Animation,Javafx,我是初学者。我正在做一个简单的2D游戏。在游戏中,一个彩色圆圈穿过彩色矩形障碍物。它必须与颜色相匹配。游戏循环是使用时间线实现的。现在我希望动画的速度随着时间线的每次迭代而增加。也就是说,每次迭代都必须加快矩形的速度。我已经在handle方法中完成了以下代码检查这个网站和其他网站。但它不起作用 double duration = timeline.getCycleDuration().toMillis(); if(duration > 1) {
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)
是一个常数,您在第一帧时只需加速一次…那么我应该怎么做来增加循环次数?我正在谷歌上搜索解决方案很多…使用我自己的知识…但没有任何帮助