Я новичок. Я делаю простую 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();