如何检测JavaFX时间的关键事件

时间:2017-02-06 11:14:31

标签: java javafx

我正在制作简单的太空飞船游戏。我有一个发射火箭的球员(太空船)。当按下空格按钮时,玩家发射火箭。问题在于,当我持有“太空”时,火箭会不断发射。如何防止此效果并按下仅每2秒检测到的空格按钮(例如,仅发射一枚火箭)?

3 个答案:

答案 0 :(得分:0)

您可能会尝试创建一个列表,其中存储按下的键。按下按钮后,监听器会将该按钮添加到列表中,并开始计算压力时间。不确定这是否是最好的方法,但我知道,当开发人员想要一次处理几个按键时使用相同的程序。

答案 1 :(得分:0)

您可以在Ship课程中存储是否已准备好发射火箭,然后在发射火箭的方法中,检查此成员。

在火箭发射时将此成员设置为false,然后您可以启动Timeline例如,它将在完成时重置标记。

发货类

public class Ship {

    private boolean readyToFireRocket = true;

    private static final double ROCKET_LAUNCHING_DELAY = 2d;

    public void fireRocket() {
        if(readyToFireRocket) {
            readyToFireRocket = false;
            System.out.println("Rocket is fired");

            KeyFrame keyFrame = new KeyFrame(Duration.seconds(ROCKET_LAUNCHING_DELAY),
                e -> readyToFireRocket = true);
            Timeline reloadRockets = new Timeline(keyFrame);
            reloadRockets .play();
        }
    }
}

示例应用

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        Parent root = new BorderPane();
        Ship ship = new Ship();

        Scene scene = new Scene(root, 300, 275);
        scene.setOnKeyPressed(e -> {
            if(e.getCode() == KeyCode.SPACE) {
                ship.fireRocket();
            }
        });
        primaryStage.setScene(scene);
        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }
}

答案 2 :(得分:0)

一种选择是在使用事件处理程序时取消注册事件处理程序2秒(并在持续时间结束时重新注册它)。我假设你使用setOnKeyPressed(e -> ...)来注册对按 space 作出反应的处理程序。

  • 创建并保留对该处理程序的引用,以便您可以随意注册和取消注册。
  • 创建一个延迟为2秒的PauseTransition,在完成后执行上述处理程序(无所事事)。
  • handle()方法中,取消注册处理程序并开始转换。

以下是一个例子:

public class FXExmple extends Application{

    private Button button = new Button("PRESS SPACE");
    private PauseTransition pt = new PauseTransition(Duration.seconds(2));

    @Override
    public void start(Stage stage) throws Exception {

        MyEventHandler eh = new MyEventHandler();
        pt.setOnFinished(e -> button.setOnKeyPressed(eh));
        button.setOnKeyPressed(eh);

        Pane pane = new Pane();
        pane.getChildren().add(button);
        Scene scene = new Scene(pane);
        stage.setScene(scene);
        stage.sizeToScene();
        stage.show();
    }

    private class MyEventHandler implements EventHandler<KeyEvent> {

        @Override
        public void handle(KeyEvent event) {

            System.out.println("FIRED");
            button.setOnKeyPressed(null);
            pt.play();
        }
    }

    public static void main(String[] args) {

        launch(args);
    }
}

请注意,由于存在与(de)注册处理程序和开始转换相关联的持续时间,因此这不会让您对持续时间进行精确控制,但它们非常小。操作系统发送事件的频率也有限制,因此如果您计划延迟至约50毫秒 - 请注意。