Прием 2 клавиатурных вводов одновременно с помощью KeyListener - PullRequest
0 голосов
/ 17 марта 2019
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
}

При этом пользователь может только двигаться или стрелять, но не одновременно.Например, если пользователь удерживает стрелку вправо для перемещения вправо и нажимает пробел, он останавливается.

Ответы [ 2 ]

1 голос
/ 17 марта 2019

Используйте коллекцию атрибутов уровня класса, чтобы определить, какие другие клавиши были нажаты. Вам нужно будет реализовать логику для более чем одной нажатой клавиши в функции keyPressed, которая выполняет итерацию списка. Также удалите ключ из списка в функции keyReleased.

0 голосов
/ 25 марта 2019
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), ничего в цикле не будет выполнено.

...