Javafx: несколько списков ключей одновременно - PullRequest
0 голосов
/ 30 сентября 2018

Я пытаюсь воссоздать игру Pong в Javafx, но у меня возникла проблема с движением платформ.

Я использую списки ключей и операторы switch для перемещения платформ вверх и вниз.Левый с W и S и правый с Вверх и Вниз.

Работает хорошо, когда я нажимаю их отдельно, но не когда я хочу их переместить одновременно.

    package application;

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.BorderPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        try {
            BorderPane root = new BorderPane();
            Scene scene = new Scene(root,700,400);
            primaryStage.setScene(scene);
            primaryStage.show();
            scene.setFill(Color.BLACK);

            Rectangle player1 = new Rectangle();
            player1.setWidth(10);
            player1.setHeight(50);
            player1.setY(175);
            player1.setX(10);
            player1.setFill(Color.WHITE);
            root.getChildren().add(player1);

            Rectangle player2 = new Rectangle();
            player2.setWidth(10);
            player2.setHeight(50);
            player2.setY(175);
            player2.setX(680);
            player2.setFill(Color.WHITE);
            root.getChildren().add(player2);


            scene.setOnKeyPressed(new EventHandler<KeyEvent>(){ 
                public void handle(KeyEvent event) {
                    switch(event.getCode()) {
                    case W: if(player1.getY() -3 >= 0) {player1.setY(player1.getY()- 4);} break;
                    case S: if(player1.getY() +53 <= 400) {player1.setY(player1.getY()+4);} break;
                    case UP: if(player2.getY() -3 >= 0) {player2.setY(player2.getY()- 4);} break;
                    case DOWN: if(player2.getY() +53 <= 400) {player2.setY(player2.getY()+4);} break;
                    }
                }
            });


        } catch(Exception e) {
            e.printStackTrace();
        }
    }

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

1 Ответ

0 голосов
/ 01 октября 2018

JavaFX обрабатывает только один KeyCode в обработчике событий.Таким образом, нет способа проверить наличие нескольких кодов ключей из объекта keyevent.Однако он обрабатывает все коды клавиш, которые нажимаются последовательно.Поэтому, если вы одновременно нажимаете A & B, он обрабатывает события для A & B в порядке их нажатия.Поэтому, пользуясь этой функцией, мы можем немного подправить и обработать обработку событий нажатия нескольких клавиш.

Учитывая ваш пример, продолжайте регистрировать все коды клавиш (в наборе), которые проходят через обработчик нажатых событий, и выполняйте ваши действия.логика соответственно.И убедитесь, что очищенный набор ключей отпущен.Таким образом, мы можем узнать, какие клавиши нажаты вместе.

Ниже приведен код, который демонстрирует мое объяснение выше.И это сработало в вашем примере:)

final List<KeyCode> acceptedCodes = Arrays.asList(KeyCode.S, KeyCode.W, KeyCode.UP, KeyCode.DOWN);
            final Set<KeyCode> codes = new HashSet<>();
            scene.setOnKeyReleased(e -> codes.clear());
            scene.setOnKeyPressed(e -> {
                if (acceptedCodes.contains(e.getCode())) {
                    codes.add(e.getCode());
                    if (codes.contains(KeyCode.W)) {
                        if (player1.getY() - 3 >= 0) {
                            player1.setY(player1.getY() - 4);
                        }
                    } else if (codes.contains(KeyCode.S)) {
                        if (player1.getY() + 53 <= 400) {
                            player1.setY(player1.getY() + 4);
                        }
                    }
                    if (codes.contains(KeyCode.UP)) {
                        if (player2.getY() - 3 >= 0) {
                            player2.setY(player2.getY() - 4);
                        }
                    } else if (codes.contains(KeyCode.DOWN)) {
                        if (player2.getY() + 53 <= 400) {
                            player2.setY(player2.getY() + 4);
                        }
                    }
                }
            });
...