【问题标题】:Accepting 2 keyboard inputs at once using KeyListener使用 KeyListener 一次接受 2 个键盘输入
【发布时间】:2019-08-07 17:10:00
【问题描述】:
public void keyPressed(KeyEvent e) {
    if (e.getKeyCode() == 32){ //spacekey
        if (menu.isRun == true){ //Checks if menu is active or not
            if (framecount > 10){ //Prevents too many missiles
                instance.player.spaceKeyPressed();
                framecount = 0;
            }
        }
        menu.isRun = true; //sets menu to inactive
        if (toggle != true){//prevents reopening game after a game over
            if (menu.spaceKeyPressed()){
                instance.CanRun = true; //loads game
                toggle = true;
                menu.update();//updates menu
            }
        }
    }
    if (e.getKeyCode() == 39) instance.player.rightKeyPressed();//right key moves player right
    if (e.getKeyCode() == 37) instance.player.leftKeyPressed(); //left key moves player left
}

有了这个,用户只能移动或射击,不能同时进行。例如,如果用户按住右箭头向右移动并按空格,用户将停止。

【问题讨论】:

  • 写if (e.getKeyCode() == KeyEvent.VK_RIGHT),而不是测试39。你的代码会更容易理解。
  • @VGR “您的代码将更容易理解。” 我还使用常量进行编译时完整性检查。编译器不会选择93 而不是39,但它会检测到KeyEvent.VK_RIHGT 有问题。

标签: java awt keylistener


【解决方案1】:

使用类级别的属性集合来确定按下了哪些其他键。您必须为在迭代列表的keyPressed 函数中按下多个键实现逻辑。同时从 keyReleased 函数的列表中删除密钥。

【讨论】:

    【解决方案2】:
    boolean keyA=false;
    boolean keyD=false;
    
    //    keys
    @Override
    public void keyPressed(KeyEvent e) {
        int key= e.getKeyCode();
    
        if(key==KeyEvent.VK_A){
            keyA=true;
        }
    
        if(key==KeyEvent.VK_D){
            keyD=true;
        }
    }
    
    @Override
    public void keyReleased(KeyEvent e) {
        int key= e.getKeyCode();
    
        if(key==KeyEvent.VK_A){
            keyA=false;
        }
    
        if(key==KeyEvent.VK_D){
            keyD=false;
        }
    
    //In constructor
    new Thread(()->{
        while(true){
            try{Thread.sleep(10);}
            catch (InterruptedException e){}
    
            if(keyA)
                player.moveLeft();
            if(keyD)
                player.moveRight();
        }
    }).start();
    

    注意KeyEvent.VK_A 的用法,让生活变得更简单。 另外,请确保您的线程中有 sleep(),因为如果它只是 while(true),则循环中的任何内容都不会执行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-28
      • 2011-04-23
      • 2017-10-12
      • 2023-03-09
      • 2019-01-03
      • 1970-01-01
      相关资源
      最近更新 更多