【发布时间】:2021-12-04 20:24:34
【问题描述】:
我有这个 JavaFX Circle,它根据键盘的箭头移动。
AnimationTimer 所做的只是每帧刷新圆的位置。
我发现每次触发KeyEvent 时都会发生0.1 的运动,以使动画足够平滑,但它的运动速度非常慢。另一方面,如果我将运动更改为 1.0 或 10.0,无疑会更快,但也更加不稳定(您可以清楚地看到它开始以离散值移动)。
我希望能够保持每帧最多 0.1 的翻译流畅度,而且还能够更改每次触发按键时应该移动多少空间。
下面是对问题的描述:
public class MainFX extends Application {
private double playerX;
private double playerY;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
AnchorPane pane = new AnchorPane();
Scene scene = new Scene(pane, 800, 600);
primaryStage.setScene(scene);
primaryStage.show();
playerX = pane.getWidth()/2;
playerY = pane.getHeight()/2;
Circle player = new Circle(playerX,playerY,10);
pane.getChildren().add(player);
scene.addEventHandler(KeyEvent.KEY_PRESSED, this::animate);
AnimationTimer timer = new AnimationTimer() {
@Override
public void handle(long now) {
player.setCenterX(playerX);
player.setCenterY(playerY);
}
};
timer.start();
}
private void animate(KeyEvent key){
if (key.getCode() == KeyCode.UP) {
playerY-=0.1;
}
if (key.getCode() == KeyCode.DOWN) {
playerY+=0.1;
}
if (key.getCode() == KeyCode.RIGHT) {
playerX+=0.1;
}
if (key.getCode() == KeyCode.LEFT) {
playerX-=0.1;
}
}
}
【问题讨论】:
-
您实际上只更改了键处理程序中的位置,因此播放器仅在每个键盘事件上移动。这些基本上是相距较远的键盘重复(并由操作系统控制)。更好的方法是定义代表玩家速度的变量,您可以在
KEY_PRESSED和KEY_RELEASED事件中修改这些变量。在动画计时器中,您可以使用now变量计算自上次更新以来经过了多少时间,并相应地更新位置。 -
stackoverflow.com/a/5199636/8556269 我认为这可能会有所帮助,按键事件的速度取决于操作系统和/或帧速率,因此如果您需要一致的结果,则不能真正依赖它6
标签: java animation javafx event-handling