当前位置: 首页 > 知识库问答 >
问题:

KeyListener-按住时释放的忽略键(Ubuntu,...)

丌官玺
2023-03-14

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

1368696607559 - Pressed
1368696608052 - Released
1368696608053 - Pressed
1368696608082 - Released
1368696608083 - Pressed
1368696608112 - Released
1368696608113 - Pressed
1368696608143 - Released
1368696608144 - Pressed
1368696608173 - Released
//Inner Class
private class KeyDispatcher extends KeyAdapter implements ActionListener{

    private BitSet keyBits = new BitSet(256);
    private Timer timer = new Timer(20, this);
    boolean player1Attack = false, player2Attack = false;

    public KeyDispatcher(){
        timer.start();
    }

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

    @Override
    public void keyReleased(KeyEvent e) {
        int keyCode = e.getKeyCode();
        keyBits.clear(keyCode);
        if(player1Attack && !isKeyPressed(KeyEvent.VK_SPACE)){
            controller.stopAttack(0);
            player1Attack = false;
        }
        //player 2
        ...
    }

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

    @Override
    public void actionPerformed(ActionEvent e) {
        if(isGameOver()){
            timer.stop();
        }else{
            //player1
            if(!player1Attack && isKeyPressed(KeyEvent.VK_RIGHT)){
                controller.moveRight(0);
            }
            if(!player1Attack && isKeyPressed(KeyEvent.VK_UP)){
                controller.moveUp(0);
            }
            if(!player1Attack && isKeyPressed(KeyEvent.VK_DOWN)){
                controller.moveDown(0);
            }
            if(!player1Attack && isKeyPressed(KeyEvent.VK_LEFT)){
                controller.moveLeft(0);
            }
            if(!player1Attack && isKeyPressed(KeyEvent.VK_NUMPAD0)){
                controller.attack(0); player1Attack = true; update();
            }
            //player2
            ...
        }
    }

}
    Action attack = new AbstractAction(){

        @Override
        public void actionPerformed(ActionEvent e) {
            controller.attack(0);
        }

    };
    Action stopAttack = new AbstractAction(){

        @Override
        public void actionPerformed(ActionEvent e) {
            controller.stopAttack(0);
        }

    };
    background.getInputMap().put(KeyStroke.getKeyStroke("SPACE"), "attack");
    background.getActionMap().put("attack", attack);

    background.getInputMap().put(KeyStroke.getKeyStroke("released SPACE"), "stopAttack");
    background.getActionMap().put("stopAttack", stopAttack);

提前致谢

共有1个答案

康元凯
2023-03-14

您应该尝试使用键绑定。

更多信息来自这里的文档

 类似资料:
  • 问题内容: 我在另一个问题(> 如何在Java中同时处理按键?)的注释部分提出了这个问题,并被要求提出一个新问题。 我的问题是,当用户按下按键时,当我创建按键列表ArrayList时,不会通过keyReleased事件足够快地将其删除。我希望运动与“ asdf”和北,东,南,西,东北…等保持一致。 这是我的两个事件的代码: 直到我通过lastKey(String)变量将第二个检查添加到那里,金字塔

  • 本文向大家介绍python按键按住不放持续响应的实例代码,包括了python按键按住不放持续响应的实例代码的使用技巧和注意事项,需要的朋友参考一下 在学习飞机大战(我也不知道为什么都拿这个练手),飞机左右控制都是按键按一次移动一次,不能按住一个键后持续移动,离开后停止移动。 为了解决这个,查看了参考手册,说让用pygame.key.set_repeat() 方法,奈何我刚开始学也看不太明白,只能看

  • 问题内容: 我一直在尝试找出如何 逐渐 加速按下键时的精灵,然后一旦释放键,就逐渐减速直至停止,就像 小行星上 的飞船一样。如果可能,我想在没有任何游戏引擎的情况下执行此操作。我搜索了所以这个时候,发现相关的问题,但他们并没有回答我的问题 恰好 在我看来。 到目前为止,我想到的是: 我只是不确定如何正确地编程,因为我只能想到以相同的值增加而在持有时不会逐渐加速的方法。 所以这是我的目标( 逐渐加快

  • 所以最基本的,我想做的是使用LWJGL让我的球员在比赛中移动。玩家当前正在移动,但当你按住按钮时,他没有继续移动。 更新的代码: 我的代码仍然有同样的问题,我开始认为是Keyboard.next()阻止了我按住按钮,而播放器仍然在移动。

  • 我试图使用Jackson注释来重新命名序列化过程中产生的一些json标签。所有注释都编译得很好,当我运行时,除了所有Jackson注释之外,Jackson序列化工作完全被忽略。即使像@jsonignore或@jsonproperty这样的基本命令对json响应也没有影响。构建路径中的库有: 下面是我需要序列化的一个类的代码示例:

  • 有什么想法为什么@primary在这里没有被考虑在内吗?