【问题标题】:Javafx: multiple keylisteners at onceJavafx:一次多个keylisteners
【发布时间】:2018-09-30 18:27:29
【问题描述】:

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

我正在使用 keylisteners 和 switch 语句来上下移动平台。左边是 W 和 S,右边是 Up 和 Down。

当我单独按下它们时效果很好,但当我想同时移动它们时就不行了。

    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);
    }
}

【问题讨论】:

  • 我没试过,但你应该尝试写scene#setOnKeyPlayer1Pressed,你必须处理WS键,ANDscene#setOnKeyPlayer2Pressed,处理UPDOWN...

标签: java javafx keylistener


【解决方案1】:

JavaFX 在事件处理程序中只处理一个 KeyCode。所以没有办法从一个 keyevent 对象中检查多个键码。但是,它确实会处理所有按顺序按下的 KeyCode。因此,如果您一次按下 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);
                        }
                    }
                }
            });

【讨论】:

    猜你喜欢
    • 2018-01-24
    • 2020-12-10
    • 2017-10-07
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多