Обработка ключевых событий на временной шкале javafx - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь сделать игру «Дудл-змейка» в Java. Я хочу, чтобы змейка двигалась на 1 плитку каждые 0,5 секунды, и при этом у нее все еще была возможность регулировать направление с клавиатуры. Я использую объект Timeline для отображения каждого кадра, но когда я использую его, ключевое событие не может быть извлечено с клавиатуры. В чем проблема и как ее исправить, спасибо. Вот код ниже: Функциональность игры работает нормально, просто не работает ключевое событие.

private BorderPane main = new BorderPane();
    private Pane gamePane = new Pane();
    private int score;
    private SnakeBody snake;
    private Point food;
    private Timeline mainLoop;

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) {
        snake = new SnakeBody(DEFAULT_DIMENSION, START_LENGTH, Snake.LEFT);

        Scene scene = new Scene(main, 500, 500);
        scene.getStylesheets().add("one/Snake/SnakeStyle.css");

        stage.setTitle("Snake");
        stage.setScene(scene);
        stage.show();

        scene.setOnKeyPressed(e -> {
            // Add System.out.println(), there is no response
            switch (e.getCode()) {
                case UP:
                    snake.setNext(Snake.UP);
                    break;
                case DOWN:
                    snake.setNext(Snake.DOWN);
                    break;
                case LEFT:
                    snake.setNext(Snake.LEFT);
                    break;
                case RIGHT:
                    snake.setNext(Snake.RIGHT);
                    break;
            }
        });

        mainLoop = new Timeline(new KeyFrame(Duration.millis(500),
                e -> {
                    if (snake.isLoss())
                        mainLoop.stop();
                    interfaceSetup();
                    drawSnake();
                    drawFood();
                    snake.move();
                    if (snake.getFood(food)) {
                        score++;
                        snake.acquireFood();
                        food = null;
                    }
                }));
        mainLoop.setCycleCount(Timeline.INDEFINITE);
        mainLoop.play();

        main.widthProperty().addListener(ov -> interfaceSetup());
        main.heightProperty().addListener(ov -> interfaceSetup());
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...