2016-04-20 5 views
0

Я ничего не искал и не нашел. Я пытаюсь получить простой прыгающий мяч для ускорения на постоянной основе. Приведенный ниже код не ускоряет шарик вообще (даже щелчком мыши), однако свойство getRate() действительно увеличивается, как ожидалось. Если я прокомментирую вызов метода увеличенияSpeed ​​() в moveBall(), щелчок мыши ускорит шарик.Увеличение скорости анимации в методе ключевого кадра, по-видимому, отключает функцию

import javafx.application.Application; 
import javafx.stage.Stage; 
import javafx.scene.Scene; 
import javafx.scene.input.KeyCode; 

public class MyApp extends Application { 
    @Override 
    public void start(Stage primaryStage) { 
    Bounce bouncePane = new Bounce(); 
    bouncePane.setOnMousePressed(e -> bouncePane.increaseSpeed()); 

    Scene scene = new Scene(bouncePane, 250, 150); 
    primaryStage.setTitle("Bouncing Ball"); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 
    bouncePane.requestFocus(); 
} 
} 

public class Bounce extends Pane { 
    public final double rad = 25; 
    private double x = rad, y = rad; 
    private double dx = 1, dy = 1; 
    private Circle ball = new Circle(x, y, rad); 
    private Timeline anim; 

    public Bounce() { 
    ball.setFill(Color.BLUE); 
    getChildren().add(ball); 

    anim = new Timeline(
    new KeyFrame(Duration.millis(50), e -> moveBall())); 
    anim.setCycleCount(Timeline.INDEFINITE); 
    anim.play(); 
} 

public void increaseSpeed() { 
    anim.setRate(anim.getRate() + 0.5); 
    System.out.println(anim.getRate()); 
} 

protected void moveBall() { 

    if (x < rad || x > getWidth() - rad) { 
    dx *= -1; 
    } 
    if (y < rad || y > getHeight() - rad) { 
    dy *= -1; 
    } 

    x += dx; 
    y += dy; 
    ball.setCenterX(x); 
    ball.setCenterY(y); 
    increaseSpeed(); 
} 
} 

ответ

0

Ваше приложение на самом деле работает (вроде)

Если установить продолжительность вашего KeyFrame в Duration.millis(1_000) вместо Duration.millis(50), то вы увидите, скорость анимации вверх (ну до фактора 1_000/60).

А? Что происходит

По умолчанию JavaFX ограничен 60 кадрами в секунду. Ключевые кадры на вашей временной шкале не будут вызываться чаще, чем это, независимо от того, для чего вы установили скорость воспроизведения. Поскольку в вашем примере вы устанавливаете начальную продолжительность анимации до 50 миллисекунд, затем увеличиваете скорость на 50 процентов от первоначальной скорости в каждом кадре, обратный вызов анимации для ключевого кадра быстро (за долю времени, незаметный для человеческого глаза) достигает максимальной частоты кадров в 60 кадров в секунду, и как только это произойдет, вы не сможете запустить ее быстрее.

Что вы можете сделать

Для такого рода проблемы, возможно, не полагаются на скорость воспроизведения анимации, чтобы контролировать скорость вашего объекта. Вместо этого используйте "game loop" с использованием AnimationTimer и сопоставьте скорость с вашими объектами и переместите объект в нужное положение на основе цикла, например, в этом AnimationTimerTest от JamesD.

+0

Большое спасибо, очень полезно! – Rob