Javafx:同时有多个keylisteners [英] Javafx: multiple keylisteners at once

查看:176
本文介绍了Javafx:同时有多个keylisteners的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm trying to recreate the game Pong in Javafx, but i ran into a problem with the movement of the platforms.

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

I'm using the keylisteners and switch statements to move the platforms up and down. The left one with W and S and the right one with Up and Down.

当我单独按下它们时它工作正常,但是当我想要将它们移动到同时。

It works fine when i press them seperatly, but not when I want to move them at the same time.

    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在事件处理程序中只处理一个KeyCode。因此无法检查keyevent对象中的多个键代码。但是它会处理按顺序方式按下的所有KeyCodes。所以,如果按A& B,它一次处理事件A& B按他们按下的顺序排列。因此,利用此功能,我们可以调整一下并处理多键按下事件处理。

JavaFX processes only one KeyCode in an event handler. So there is no way to check for multiple key codes from a keyevent object. However it do processes all KeyCodes that are pressed in a sequential manner. So if you press A & B at a time, it processes events for A & B in the order they are pressed. So taking advantage of this feature we can tweak a bit and handle multi key press event handling.

考虑到您的示例,请继续注册所有密钥代码(在一组中)通过按下事件处理程序并相应地执行您的逻辑。并确保清除释放的密钥集。通过这种方式,我们可以知道哪些键被按在一起。

Considering for your example, keep registering all the key codes(in a set) that come through pressed event handler and perform your logic accordingly. And ensure to clear the set on key released. This way we can know which keys are pressed together.

以下是演示我上述解释的代码。它适用于你的例子:)

Below is the code that demonstrates my above explanation. And it worked in your example :)

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

这篇关于Javafx:同时有多个keylisteners的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆