Javafx:一次多个KeyListener

Javafx:一次多个KeyListener,java,javafx,keylistener,Java,Javafx,Keylistener,我试图在Javafx中重新创建游戏Pong,但我遇到了平台移动的问题 我使用keylisteners和switch语句来上下移动平台。左边的是W和S,右边的是上下 当我分别按下它们时效果很好,但当我想同时移动它们时效果就不好了 package application; import javafx.application.Application; import javafx.event.EventHandler; import javafx.scene.Scene; import jav

我试图在Javafx中重新创建游戏Pong,但我遇到了平台移动的问题

我使用keylisteners和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);
    }
}
包应用;
导入javafx.application.application;
导入javafx.event.EventHandler;
导入javafx.scene.scene;
导入javafx.scene.input.KeyEvent;
导入javafx.scene.layout.BorderPane;
导入javafx.scene.paint.Color;
导入javafx.scene.shape.Rectangle;
导入javafx.stage.stage;
公共类主扩展应用程序{
@凌驾
公共无效开始(阶段primaryStage){
试一试{
BorderPane根=新的BorderPane();
场景=新场景(根,700400);
初级阶段。场景(场景);
primaryStage.show();
场景。设置填充(颜色。黑色);
矩形播放器1=新矩形();
播放器1.设置宽度(10);
播放器1.设置高度(50);
玩家1.塞蒂(175);
player1.setX(10);
player1.setFill(颜色:白色);
root.getChildren().add(player1);
矩形播放器2=新矩形();
播放器2.设置宽度(10);
播放器2.设置高度(50);
玩家2.塞蒂(175);
player2.setX(680);
player2.setFill(颜色:白色);
root.getChildren().add(player2);
scene.setOnKeyPressed(新的EventHandler(){
公共无效句柄(KeyEvent事件){
开关(event.getCode()){
案例W:如果(player1.getY()-3>=0){player1.setY(player1.getY()-4);}break;
案例S:if(player1.getY()+53=0){player2.setY(player2.getY()-4);}break;

区分大小写:if(player2.getY()+53JavaFX在一个事件处理程序中只处理一个键代码。因此,无法检查一个keyevent对象中的多个键代码。但是它确实会处理按顺序按下的所有键代码。因此,如果您一次按下a和B,它会按a和B按下的顺序处理事件。因此,利用此功能,我们可以可以稍微调整并处理多按键事件处理

以您的示例为例,不断注册通过按下事件处理程序产生的所有按键代码(在一个集合中),并相应地执行您的逻辑。并确保在按键释放时清除集合。这样我们可以知道哪些按键被按下在一起

下面是演示我上述解释的代码。它在您的示例中起了作用:)

final List acceptedCodes=Arrays.asList(KeyCode.S、KeyCode.W、KeyCode.UP、KeyCode.DOWN);
最终设置代码=新HashSet();
scene.setOnKeyReleased(e->codes.clear());
场景。按下设置键(e->{
if(acceptedCodes.contains(e.getCode())){
code.add(如getCode());
if(代码包含(键代码W)){
如果(player1.getY()-3>=0){
player1.setY(player1.getY()-4);
}
}else if(code.contains(KeyCode.S)){
如果(player1.getY()+53=0){
player2.setY(player2.getY()-4);
}
}else if(code.contains(KeyCode.DOWN)){

如果(player2.getY()+53我没有试过,但是你应该试着写
scene#setOnKeyPlayer1Pressed
,你必须处理
W
S
键,以及
scene#setonkeyplayer2 pressed
,处理
UP
DOWN
。。。
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);
                        }
                    }
                }
            });