2017-02-06 8 views
0

私はシンプルなスペースクラフトゲームを作っています。私はロケットを発射する選手(宇宙船)を持っています。スペースボタンを押すと、プレイヤーはロケットを発射します。問題は、私が「宇宙」を保持すると、ロケットが連続的に発射されるということです。この効果を防​​ぐには、どうすればいいのですか?たとえば、スペースボタンを2秒ごとに検出することができます(そして、ロケットは1つだけ起動します)。時間の経過とともにキーイベントを検出する方法JavaFX

+0

スペースバーが押されている間、またはスペースバーのすべてのプレスで1つのロケットを発射したい場合は、n秒ごとに発砲しますか? – Antoniossss

+0

船が発砲するたびにスペースバーを2秒間無効にしたい。 – user7470489

+0

@JonKコンセプトは似ていますが、これはSwingではなくJavaFXの質問です。私は、JavaFXに他の方法でそれを行う機会を与えないのは公正だとは思わない。 – user1803551

答えて

0

押されたキーが保存されるリストを作成しようとする可能性があります。ボタンを押すとリスナーはそのボタンをリストに追加し、圧力の時間をカウントし始めます。これが最善の方法であるかどうかはわかりませんが、開発者が一度に押されたキーをほとんど処理したくない場合と同じ手順を使用していることがわかります。

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); 
    } 
} 
0

オプションの1つは、それが使用されるたびに2秒の期間中のイベントハンドラの登録を解除(および再登録することですそれは期間の終わりに)。私はあなたがスペースを押すことに反応するハンドラを登録するためにsetOnKeyPressed(e -> ...)を使用していると仮定します。

  • そのハンドラへの参照を作成し、保持して、自由に登録および登録解除できるようにします。
  • は、(何もしない)に行われます上記のハンドラを登録し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); 
    } 
} 

注ハンドラを登録して移行を開始するが、非常に小さいです。また、OSがイベントを送信する頻度にも限界があります。したがって、〜50msの遅延になることを計画している場合は注意してください。

関連する問題