Como escrever um KeyListener para o JavaFX

Eu quero escrever um pequeno jogo onde eu possa mover uma bola em um Painel JavaFX usando as teclas W , A , S , D.
Eu tenho um getPosX() e setPosX() mas eu não sei como escrever um KeyListener que, por exemplo, calcular setPosX(getPosX()+1) se eu pressionar D.

O que eu tenho que fazer?

De um post do Fórum JavaRanch .

Os manipuladores de pressionamento e liberação de tecla são adicionados à cena e atualizam as variables ​​de estado de movimento registradas no aplicativo. Um timer de animação conecta-se ao mecanismo de pulso do JavaFX (que por padrão será limitado para triggersr um evento 60 vezes por segundo) – de modo que é um tipo de “loop” de jogo. No cronômetro, as variables ​​de estado de movimento são verificadas e suas ações delta aplicadas à posição do personagem – que, na verdade, move o personagem pela canvas em resposta aos pressionamentos de tecla.

zelda

 import javafx.animation.AnimationTimer; import javafx.application.Application; import javafx.event.EventHandler; import javafx.scene.*; import javafx.scene.image.*; import javafx.scene.input.KeyEvent; import javafx.scene.paint.Color; import javafx.stage.Stage; /** * Hold down an arrow key to have your hero move around the screen. * Hold down the shift key to have the hero run. */ public class Runner extends Application { private static final double W = 600, H = 400; private static final String HERO_IMAGE_LOC = "http://icons.iconarchive.com/icons/raindropmemory/legendora/64/Hero-icon.png"; private Image heroImage; private Node hero; boolean running, goNorth, goSouth, goEast, goWest; @Override public void start(Stage stage) throws Exception { heroImage = new Image(HERO_IMAGE_LOC); hero = new ImageView(heroImage); Group dungeon = new Group(hero); moveHeroTo(W / 2, H / 2); Scene scene = new Scene(dungeon, W, H, Color.FORESTGREEN); scene.setOnKeyPressed(new EventHandler() { @Override public void handle(KeyEvent event) { switch (event.getCode()) { case UP: goNorth = true; break; case DOWN: goSouth = true; break; case LEFT: goWest = true; break; case RIGHT: goEast = true; break; case SHIFT: running = true; break; } } }); scene.setOnKeyReleased(new EventHandler() { @Override public void handle(KeyEvent event) { switch (event.getCode()) { case UP: goNorth = false; break; case DOWN: goSouth = false; break; case LEFT: goWest = false; break; case RIGHT: goEast = false; break; case SHIFT: running = false; break; } } }); stage.setScene(scene); stage.show(); AnimationTimer timer = new AnimationTimer() { @Override public void handle(long now) { int dx = 0, dy = 0; if (goNorth) dy -= 1; if (goSouth) dy += 1; if (goEast) dx += 1; if (goWest) dx -= 1; if (running) { dx *= 3; dy *= 3; } moveHeroBy(dx, dy); } }; timer.start(); } private void moveHeroBy(int dx, int dy) { if (dx == 0 && dy == 0) return; final double cx = hero.getBoundsInLocal().getWidth() / 2; final double cy = hero.getBoundsInLocal().getHeight() / 2; double x = cx + hero.getLayoutX() + dx; double y = cy + hero.getLayoutY() + dy; moveHeroTo(x, y); } private void moveHeroTo(double x, double y) { final double cx = hero.getBoundsInLocal().getWidth() / 2; final double cy = hero.getBoundsInLocal().getHeight() / 2; if (x - cx >= 0 && x + cx <= W && y - cy >= 0 && y + cy <= H) { hero.relocate(x - cx, y - cy); } } public static void main(String[] args) { launch(args); } } 
 Scene myScene = new Scene(); KeyCombination cntrlZ = new KeyCodeCombination(KeyCode.Z, KeyCodeCombination.CONTROL_DOWN); myScene.setOnKeyPressed(new EventHandler(){ @Override public void handle(KeyEvent event) { if(contrlZ.match(event)){ //Do something } } }); 
Intereting Posts