私は現在、JavaFXでちょっと試合をしています。私はkeyEventsを捕まえるのにいくつかの問題がありました。JavaFX fireEvent StackOverflowError
今私はそれらをキャッチすることができますが、プログラムはjava.lang.StackOverflowError
を投げて、キーが押されたときに期待したことをしませんでした。ここで
はメインクラスです:
public class WarbladeFX extends Application {
Game root;
public void start(Stage primaryStage) {
root = new Game();
Scene scene = new Scene(root, 800, 600);
scene.setFill(new Color(0,0,0,1));
scene.setOnKeyPressed(new EventHandler<KeyEvent>() {
public void handle(KeyEvent event) {
Event.fireEvent(root, event);
}
});
scene.setOnKeyReleased(new EventHandler<KeyEvent>() {
public void handle(KeyEvent event) {
Event.fireEvent(root, event);
}
});
primaryStage.setTitle("WarbladeFX");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
そして、ゲームのクラス:
public class Game extends Group {
Entity ship;
long delta;
HashSet<String> input = new HashSet<>();
public Game() {
File f = new File("src/ressources/ship.gif");
ship = new Entity(new Image("file:///" + f.getAbsolutePath().replace("\\", "/")) ,300, 300);
getChildren().add(ship);
setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
//System.out.println(".handle()");
String code = event.getCode().toString();
if(!input.contains(code))
input.add(code);
}
});
setOnKeyReleased(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
String code = event.getCode().toString();
input.remove(code);
}
});
new AnimationTimer(){
@Override
public void handle(long now) {
if(input.contains("LEFT"))
ship.setVelX(-1);
if(input.contains("RIGHT"))
ship.setVelX(1);
ship.move(now);
getChildren().clear();
getChildren().add(ship);
}
}.start();
}
}
いくつかの助けは非常に素晴らしいことです。
を行うことができますスタックトレースを投稿してください。 –
シーングラフのノードで発生したイベントは、親に親の親、親の親、最終的にはシーンまで「バブルアップ」します。シーンのイベントハンドラは、イベントを「ルート」に「リファイア」し、シーンにバブルして再び処理され、ルートに戻されます...など、実際には何を考えていますか?シーンのイベントハンドラを行うには? –
私はゲームクラスのイベントを処理しようとしていますが、fireEventがなければ何もしません – Dicegamer