私はシンプルなスペースクラフトゲームを作っています。私はロケットを発射する選手(宇宙船)を持っています。スペースボタンを押すと、プレイヤーはロケットを発射します。問題は、私が「宇宙」を保持すると、ロケットが連続的に発射されるということです。この効果を防ぐには、どうすればいいのですか?たとえば、スペースボタンを2秒ごとに検出することができます(そして、ロケットは1つだけ起動します)。時間の経過とともにキーイベントを検出する方法JavaFX
0
A
答えて
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の遅延になることを計画している場合は注意してください。
関連する問題
- 1. SQL-時間の経過とともにクライアントのデータを合計する方法
- 2. Haskellで時間の経過とともにシステムをモデル化する方法
- 3. 時間の経過とともにC#プロパティをアニメーション化する方法は?
- 4. 時間の経過とともにTkinterパネルを更新する
- 5. 時間の経過とともに変化するフィールド値
- 6. コンソールアプリケーションが時間の経過とともに減速する
- 7. 時間の経過とともにスワップバッファが遅くなる
- 8. GetCurrentApplicationCallbackUriは時間の経過とともに変化します
- 9. 時間の経過とともにGoogleのシートトラックのセル値
- 10. 時間の経過とともにスナップショットのWebサイト
- 11. 時間の経過とともに変数のインクリメンタルな増加
- 12. 時間の経過とともにJava 8の複合グループ化
- 13. 時間の経過とともに単純なPloneの統計
- 14. JavaFXで時間の経過とともに3Dオブジェクトの照明が異なるようにする
- 15. 時間の経過とともにffmpeg -r/fps?
- 16. 時間の経過とともにユニティフェード画像アルファ
- 17. 時間経過とタイムゾーン
- 18. Oracle経過時間とCPU時間?
- 19. グラファナ+グラファイト:時間の経過とともに静的な開始時間範囲
- 20. androidで経過時間と日付を計算する方法
- 21. データウェアハウス - 時間の経過とともに一意のデータを格納する
- 22. 時間の経過とともにコードの変化を追跡する
- 23. (After Effects)時間の経過とともにテキストの内容を変更する
- 24. 時間の経過とともにFirefoxのアドオンCPUを測定する
- 25. 時間の経過とともにテーブル内のMySQLで値を変更する
- 26. Djangoモデルのデータを時間の経過とともに記録する
- 27. 指数関数的なパルスを時間の経過とともにプロットする
- 28. 時間の経過とともに日付差を取得するSQL/Excel
- 29. 時間の経過とともにlistBoxから項目を削除する - C#;
- 30. 時間の経過とともにRunnableクラス属性を変更する
スペースバーが押されている間、またはスペースバーのすべてのプレスで1つのロケットを発射したい場合は、n秒ごとに発砲しますか? – Antoniossss
船が発砲するたびにスペースバーを2秒間無効にしたい。 – user7470489
@JonKコンセプトは似ていますが、これはSwingではなくJavaFXの質問です。私は、JavaFXに他の方法でそれを行う機会を与えないのは公正だとは思わない。 – user1803551