当前位置: 首页 > 面试题库 >

处理多次按键而忽略重复按键

乐健
2023-03-14
问题内容

我在另一个问题(> 如何在Java中同时处理按键?)的注释部分提出了这个问题,并被要求提出一个新问题。

我的问题是,当用户按下按键时,当我创建按键列表ArrayList时,不会通过keyReleased事件足够快地将其删除。我希望运动与“
asdf”和北,东,南,西,东北…等保持一致。

这是我的两个事件的代码:

@Override
public void keyPressed(KeyEvent e) {
    if(chatTextField.isFocusOwner() == true){
        //do nothing - don't walk
    } else {
        logger.debug("Key Pressed: " + e.getKeyChar());
        lastKey = keysPressed.get(keysPressed.size()-1);

        for (String key : keysPressed){
            if (!key.contains(String.valueOf(e.getKeyChar())) && !lastKey.contains(String.valueOf(e.getKeyChar()))){
                keysPressed.add(String.valueOf(e.getKeyChar()));
                System.out.println("ADDED: " + keysPressed);
            }
        }

        String keysList = keysPressed.toString();
        if (keysList.contains("w")){
            if (keysList.contains("d")){
                requestCharacterMove("NorthEast");
            } else if(keysList.contains("a")){
                requestCharacterMove("NorthWest");
            } else{
                requestCharacterMove("North");
            }
        } else if (keysList.contains("s")){
            if (keysList.contains("d")){
                requestCharacterMove("SouthEast");
            } else if(keysList.contains("a")){
                requestCharacterMove("SouthWest");
            } else{
                requestCharacterMove("South");
            }
        } else if (keysList.contains("d")){
            requestCharacterMove("East");
        } else if (keysList.contains("a")){
            requestCharacterMove("West");
        }
    }
}

@Override
public void keyReleased(KeyEvent e) {
    if(chatTextField.isFocusOwner() == true){
        //do nothing - don't walk
    } else {
        logger.debug("Key Released: " + e.getKeyChar());
        for (String key : keysPressed){
            if (key.contains(String.valueOf(e.getKeyChar()))){
                keysPressed.remove(String.valueOf(e.getKeyChar()));
                System.out.println("REMOVED: " + keysPressed);
            }
        }
    }
}

@Override
public void keyTyped(KeyEvent arg0) {
    // TODO Auto-generated method stub

}

直到我通过lastKey(String)变量将第二个检查添加到那里,金字塔创建的数量巨大。即使进行第二次检查,列表也会增加,并且几乎总是有两三份重复。因为我的角色笨拙地移动着,所以对此的任何帮助都会很棒。:(

同样,删除重复转换为char,string,arrayList的任何方法也将非常有用,因为我担心我为“简单”使用了太多类型。


问题答案:

你obseravtion事情最有可能慢慢地处理造成 仅仅 是众多的System.out.println()语句。

您没有得到对角线移动的问题是由于您的检查逻辑有些错误-而不是显式检查(例如)是否按下了键A B,而是独立地检查它们-键A在一个方向上移动字符,B在另一个方向上移动字符。总计(例如),通过移动WEST NORTH,您将有效地移动NORTHWEST。

除了使用按键列表之外,您还可以使用java.util.BitSet并为每个当前按下的按键设置位。这也应该大大减少您需要编写的代码量(keyPressed只是设置密钥代码指示的位,keyReleased清除它)。要检查是否按下了按键,请询问BitSet,然后询问当前是否设置了代码位。

编辑:使用BitSet而不是列表的示例

public class BitKeys implements KeyListener {

    private BitSet keyBits = new BitSet(256);

    @Override
    public void keyPressed(final KeyEvent event) {
        int keyCode = event.getKeyCode();
        keyBits.set(keyCode);
    }

    @Override
    public void keyReleased(final KeyEvent event) {
        int keyCode = event.getKeyCode();
        keyBits.clear(keyCode);
    }

    @Override
    public void keyTyped(final KeyEvent event) {
        // don't care
    }

    public boolean isKeyPressed(final int keyCode) {
        return keyBits.get(keyCode);
    }

}

我使示例实现了KeyListener,因此您甚至可以按原样使用它。当您需要知道是否按下某个键时,请使用isKeyPressed()。您需要确定是喜欢原始密钥代码(就像我一样)还是选择关键字符(就像您当前所做的那样)。无论如何,您将看到使用BitSet类将用于记录密钥的代码量减少到几行:)



 类似资料:
  • 问题内容: 这个问题已经在这里有了答案 : “ INSERT IGNORE”与“ INSERT…ON DUPLICATE KEY UPDATE” (11个答案) 6年前关闭。 我正在尝试完成此查询;我的标签字段设置为UNIQUE,我只是希望数据库忽略任何重复的标签。 甚至可以接受 问题答案: 建议不要使用INSERT IGNORE,因为它会忽略所有错误(即,草率的全局忽略)。相反,由于在您的示例中

  • 首先,我要感谢所有人的帮助和回复。 我正在做一个项目,要求用户按下一个键并按住它,它会触发一个操作。 当用户按下另一个键(仍然按住第一个键)时,它将触发另一个动作。 然而,我无法让JavaScript识别同时按下的两个键。

  • 我有一个你可以攻击的游戏。当空格键被按下时,武器向下移动,当它被释放时,它应该向上移动。 提前致谢

  • 问题内容: 以下是来自pylint docs的内容: 但是我没有让目录部分起作用的运气。 我有一个名为migrations的目录,其中有django-south迁移文件。当我输入–ignore = migrations时,它仍然不断向我提供migrations目录内文件中的错误/警告。 难道这不适用于目录? 如果我什至可以使用regexp来匹配被忽略的文件,它将正常工作,因为django- sou

  • 对于示例代码,我用200个随机数字的序列替换了文本:在键盘上上下按压时,条形图会滚动,而屏幕的另一半应该显示每次按下R键时随机选择的200个数字中的一个,或者在按下H键时显示一个“你好”的文本。 在一些帮助下,我能够使我的数字正确地显示在屏幕上,但我不确定如何使这两个不同的按键交互工作,我需要在两者之间周旋:随机数和文本。 我试过这样做,但我似乎不能让它在文本部分起作用:

  • 我正在尝试制作一个计算贷款利息的简单程序。我这里的代码可以工作,但只会在按下'c'键时显示结果。我如何改变逻辑,以便一旦'c'被按下,结果就会出现在屏幕上。任何的帮助都是非常感谢的。