KeyEvent:使多个输入协同工作

时间:2015-05-21 00:22:08

标签: java user-interface

查看此代码:

public void keyPressed(KeyEvent e)
{
    if (e.getKeyCode() == KeyEvent.VK_W)
    {
        new panel().player1.playerMoves("North", 10, 600,500);
    }
    else if (e.getKeyCode() == KeyEvent.VK_S)
    {
        new panel().player1.playerMoves("South", 10, 600,500);
    }

    if (e.getKeyCode() == KeyEvent.VK_UP)
    {
        new panel().player2.playerMoves("North", 10, 600,500);
    }
    else if (e.getKeyCode() == KeyEvent.VK_DOWN)
    {
        new panel().player2.playerMoves("South", 10, 600,500);
    }
}

我没有遇到任何问题,我的问题不需要我所要求的班级知识。发生的事情是有两个球员。 Player1将控件绑定到wasd键,将player2绑定到箭头键。然而,似乎这些if语句有点覆盖彼此。我的意思是,如果player1向上移动并且player2开始向下移动,则player1将不得不停止。我正在考虑使用多个线程解决这个问题,但我不确定它是否有效或是否有一个更简单的问题解决方案。有什么办法可以让多次按键一起工作吗?

1 个答案:

答案 0 :(得分:1)

您可以在某个列表中存储已按下的键,称之为pressedKeys。按下某个键后,将该键添加到pressedKeys。释放密钥后(覆盖keyReleased()方法),您将从pressedKeys中删除该密钥。然后,您可以根据按下的键移动播放器。例如,

    public void movePlayer() {
        if ( pressedKeys.contains( UP ) ) {
            movePlayerUp();
        }
        if ( pressedKeys.contains( DOWN ) ) {
            movePlayerDown();
        }
        if ( pressedKeys.contains( S ) ) {
            movePlayerDown();
        }

        ...

    }

所需的课程:

class MyListener implements KeyListener {

    private ArrayList< Integer > keysPressed = new ArrayList< Integer >();

    public MyListener() {

    }

    @Override
    public void keyPressed( KeyEvent e ) {
        if ( !keysPressed.contains( e.getKeyCode() ) ) {
            keysPressed.add( e.getKeyCode() );
        }

        movePlayer();
    }

    @Override
    public void keyReleased( KeyEvent e ) {
        keysPressed.remove( e.getKeyCode() );
    }

    public void movePlayer() {
        //move player based on what keys are pressed.
    }
}