我正在制作简单的太空飞船游戏。我有一个发射火箭的球员(太空船)。当按下空格按钮时,玩家发射火箭。问题在于,当我持有“太空”时,火箭会不断发射。如何防止此效果并按下仅每2秒检测到的空格按钮(例如,仅发射一枚火箭)?
答案 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 作出反应的处理程序。
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毫秒 - 请注意。