How do I the KeyEvent only once when it is held down?

家住魔仙堡 提交于 2019-12-07 16:39:46

问题


I am trying to shoot a missile at a certain rate but currently you can simple hold down the fire button (Space) and it will make a continuous line of missiles.

I believe this is because the KeyEvent is being triggered when you hold it down when what I need it to do is only trigger once when you hold it down.

How would I make it detect the holding down of a button as only pressing it once?

public void keyPressed(KeyEvent e) {
    int key = e.getKeyCode();
    if (key == KeyEvent.VK_SPACE) {
        fire();
    }

    if (key == KeyEvent.VK_A) {
        dx = -1;
    }

    if (key == KeyEvent.VK_D) {
        dx = 1;
    }
}

public void keyReleased(KeyEvent e) {
    int key = e.getKeyCode();
    if (key == KeyEvent.VK_SPACE) {

    }
    if (key == KeyEvent.VK_A) {
        dx = 0;
    }

    if (key == KeyEvent.VK_D) {
        dx = 0;
    }
}

回答1:


Just add a check to make sure you've released the key before allowing yourself to fire again. I use AtomicBoolean to ensure there are no multithreading issues by the different events getting fired.

private final AtomicBoolean canShoot = new AtomicBoolean(true);

public void keyPressed(KeyEvent e) {
    int key = e.getKeyCode();

    if (key == KeyEvent.VK_SPACE) {
        if (canShoot.compareAndSet(true, false)) {
            fire();
        }
    }
    // snip
}

public void keyReleased(KeyEvent e) {
    int key = e.getKeyCode();

    if (key == KeyEvent.VK_SPACE) {
        canShoot.set(true);
    }
    // snip
}


来源:https://stackoverflow.com/questions/31678173/how-do-i-the-keyevent-only-once-when-it-is-held-down

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!