使用 KeyListener 一次接受 2 个键盘输入

Posted

技术标签:

【中文标题】使用 KeyListener 一次接受 2 个键盘输入【英文标题】:Accepting 2 keyboard inputs at once using KeyListener 【发布时间】: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 有问题。 【参考方案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)
        tryThread.sleep(10);
        catch (InterruptedException e)

        if(keyA)
            player.moveLeft();
        if(keyD)
            player.moveRight();
    
).start();

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

【讨论】:

以上是关于使用 KeyListener 一次接受 2 个键盘输入的主要内容,如果未能解决你的问题,请参考以下文章

Java KeyListener 口吃

改进我的键盘输入 (KeyListener) Java

觅求高手.java键盘事件.

键盘事件KeyListener( )

键盘事件KeyListener

Java 键盘事件监听KeyListener