javafx java-8 actionlistener keylistener

Cómo escribir un KeyListener para JavaFX



java-8 actionlistener (2)

De una publicación del Foro JavaRanch .

Los controladores de pulsación y liberación de teclas se agregan en la escena y actualizan las variables de estado de movimiento registradas en la aplicación. Un temporizador de animación se engancha en el mecanismo de pulso JavaFX (que por defecto estará limitado para disparar un evento 60 veces por segundo), por lo que es una especie de "bucle" del juego. En el temporizador, las variables de estado de movimiento se verifican y sus acciones delta se aplican a la posición del personaje, lo que en efecto mueve al personaje por la pantalla en respuesta a las pulsaciones de teclas.

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<KeyEvent>() { @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<KeyEvent>() { @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); } }

Quiero escribir un pequeño juego donde pueda mover una pelota en un Panel JavaFX usando las teclas W , A , S , D.
Tengo getPosX() y setPosX() pero no sé cómo escribir un KeyListener que, por ejemplo, calculará setPosX(getPosX()+1) si setPosX(getPosX()+1) D.

¿Que tengo que hacer?


Scene myScene = new Scene(); KeyCombination cntrlZ = new KeyCodeCombination(KeyCode.Z, KeyCodeCombination.CONTROL_DOWN); myScene.setOnKeyPressed(new EventHandler<KeyEvent>(){ @Override public void handle(KeyEvent event) { if(contrlZ.match(event)){ //Do something } } });