java - 如何在 Java 中检查按键按下情况?

标签 java input io javafx

基本上,我正在学习 Java,并尝试使用 JavaFX 在 Netbeans 中制作一个简单的游戏。现在我设置了一个窗口,其中绘制了一个矩形。 (我设置了一个 Canvas 来绘图。)我已经创建了一个玩家类和全局类,但我需要知道如何读取关键输入。我的一位 friend 非常擅长 Java,所以他给我的信息很好。我阅读了 KeyEvent,但我不知道如何实现它。

非常感谢任何帮助。

最佳答案

几周前我也有同样的问题。问题是如何随时检查某个键是否被按下。解决方案有很多种,我是用bitset解决的:

package game.input;

import java.util.BitSet;

import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;

public class Input {

    /**
     * Bitset which registers if any {@link KeyCode} keeps being pressed or if it is released.
     */
    private BitSet keyboardBitSet = new BitSet();

    // -------------------------------------------------
    // default key codes
    // will vary when you let the user customize the key codes or when you add support for a 2nd player
    // -------------------------------------------------

    private KeyCode upKey = KeyCode.UP;
    private KeyCode downKey = KeyCode.DOWN;
    private KeyCode leftKey = KeyCode.LEFT;
    private KeyCode rightKey = KeyCode.RIGHT;
    private KeyCode primaryWeaponKey = KeyCode.SPACE;
    private KeyCode secondaryWeaponKey = KeyCode.CONTROL;

    Scene scene;

    public Input( Scene scene) {
        this.scene = scene;
    }

    public void addListeners() {

        scene.addEventFilter(KeyEvent.KEY_PRESSED, keyPressedEventHandler);
        scene.addEventFilter(KeyEvent.KEY_RELEASED, keyReleasedEventHandler);

    }

    public void removeListeners() {

        scene.removeEventFilter(KeyEvent.KEY_PRESSED, keyPressedEventHandler);
        scene.removeEventFilter(KeyEvent.KEY_RELEASED, keyReleasedEventHandler);

    }

    /**
     * "Key Pressed" handler for all input events: register pressed key in the bitset
     */
    private EventHandler<KeyEvent> keyPressedEventHandler = new EventHandler<KeyEvent>() {
        @Override
        public void handle(KeyEvent event) {

            // register key down
            keyboardBitSet.set(event.getCode().ordinal(), true);

        }
    };

    /**
     * "Key Released" handler for all input events: unregister released key in the bitset
     */
    private EventHandler<KeyEvent> keyReleasedEventHandler = new EventHandler<KeyEvent>() {
        @Override
        public void handle(KeyEvent event) {

            // register key up
            keyboardBitSet.set(event.getCode().ordinal(), false);

        }
    };


    // -------------------------------------------------
    // Evaluate bitset of pressed keys and return the player input.
    // If direction and its opposite direction are pressed simultaneously, then the direction isn't handled.
    // -------------------------------------------------

    public boolean isMoveUp() {
        return keyboardBitSet.get( upKey.ordinal()) && !keyboardBitSet.get( downKey.ordinal());
    }

    public boolean isMoveDown() {
        return keyboardBitSet.get( downKey.ordinal()) && !keyboardBitSet.get( upKey.ordinal());
    }

    public boolean isMoveLeft() {
        return keyboardBitSet.get( leftKey.ordinal()) && !keyboardBitSet.get( rightKey.ordinal());  
    }

    public boolean isMoveRight() {
        return keyboardBitSet.get( rightKey.ordinal()) && !keyboardBitSet.get( leftKey.ordinal());
    }

    public boolean isFirePrimaryWeapon() {
        return keyboardBitSet.get( primaryWeaponKey.ordinal());
    }

    public boolean isFireSecondaryWeapon() {
        return keyboardBitSet.get( secondaryWeaponKey.ordinal());
    }

}

关于java - 如何在 Java 中检查按键按下情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28709581/

相关文章:

java - 仅当抛出运行时异常时未找到线程绑定(bind)请求

java - 如何向 Spring MVC Controller 方法添加自定义安全注释

java - 如何根据用户输入执行不同的操作

go - 多次输入检查,如果不满足条件则重复

java - 扫描仪在使用 next() 或 nextFoo() 后跳过 nextLine()?

java - JSF 应用程序中的自动注销

java - 当我初始化扩展 fragment 时,如何停止调用父 fragment 的 onActivityCreated ?

javascript - 时间码的html5输入?

php - fread 读取不超过 8192 字节

c++ - 无需检查即可将标准输入快速读入缓冲区