Javafx:一次多个KeyListener
我试图在Javafx中重新创建游戏Pong,但我遇到了平台移动的问题 我使用keylisteners和switch语句来上下移动平台。左边的是W和S,右边的是上下 当我分别按下它们时效果很好,但当我想同时移动它们时效果就不好了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
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);
}
}
}
});