调整按键所以你不能"保持"它

时间:2015-11-14 17:08:54

标签: java keypress keyevent

不确定如何标题。

我为我的"太空入侵者提供了一些代码"打字游戏。我让整个事情都做了调整。要拍摄,我使用空格键。问题是我能够保持空格键并不断射击。我宁愿不得不多次按下它(如果我把它压下来......因为它不会持续开火)我怎么改变它?

*这里是我认为是问题根源的代码。如果来源位于其他地方,请说明。

private class KeyInputHandler extends KeyAdapter {
    private int pressCount = 1;

    /**
     * key pressed
     */
    public void keyPressed(KeyEvent e) {
        if (waitingForKeyPress) {
            return;
        }

        if (e.getKeyCode() == KeyEvent.VK_LEFT) {
            leftPressed = true;
        }
        if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
            rightPressed = true;
        }
        if (e.getKeyCode() == KeyEvent.VK_SPACE) {
            firePressed = true;
        }
    } 

    /**
     * Key Released
     */
    public void keyReleased(KeyEvent e) {

        if (waitingForKeyPress) {
            return;
        }

        if (e.getKeyCode() == KeyEvent.VK_LEFT) {
            leftPressed = false;
        }
        if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
            rightPressed = false;
        }
        if (e.getKeyCode() == KeyEvent.VK_SPACE) {
            firePressed = false;
        }
    }

添加了代码

public class ShotEntity extends Entity {
    //vertical speed
    private double moveSpeed = -300;
private Game game;

private boolean used = false;

/**
 * Create a new shot from the player
*/
public ShotEntity(Game game,String sprite,int x,int y) {
    super(sprite,x,y);

    this.game = game;

    dy = moveSpeed;
}

/**
 * Request that this shot moved based on time
 */
public void move(long delta) {
    super.move(delta);

    if (y < -100) {
        game.removeEntity(this);
    }
}

//collision
public void collidedWith(Entity other) {

    // prevents double kills.
    if (used) {
        return;
    }

    // alien killed
    if (other instanceof AlienEntity) {
        game.removeEntity(this);
        game.removeEntity(other);

        game.notifyAlienKilled();
        used = true;
    }
}

}

2 个答案:

答案 0 :(得分:2)

收听两个单独的关键事件。按下一个键,一个键被释放。现在,你做一个布尔值。     public boolean myBoolean;  按下键时,将布尔值设置为 true myBoolean==true),如果已释放,则将其设置为false(myBoolean==false)。

现在,创建一个简单的if语句:

if(myBoolean==true){ //Key is being held down
//execute this code
//Have nothing be done
}

多数民众赞成!

P.S。如果需要,您可以使用一个单独的方法来清理代码。这个方法只能改变布尔值的值:

public void changeValueOfBoolean(Boolean b){
if(b = true){
return false;
}
if(b==false){
return true;
}
}

这很简单。如果您需要任何帮助,请告诉我,如果这有帮助,请将其标记为最佳答案。随时问我任何问题,我很乐意提供帮助!

<强>澄清:

好的,所以我们有这个布尔值,对吧?现在,这个boolean essencialy决定是否按下了键。

说我们按下按钮:

因为按下了键,我们将布尔值myBoolean设为true。现在,因为用户按住了键,我们什么都不做,对吧?这就是我们创建if语句的原因:

 if(myBoolean==true){ //Key is being held down
    //execute this code
    //Have nothing be done
    }

它说,如果布尔值为真,那么我们什么都不做。回想一下,当按下键时,布尔值是真的,还记得吗?因此,当按下键时,布尔值为true,不会执行任何操作。

现在,当用户释放密钥时:

现在,假设用户已按下该键。这将调用两个听众。当按下键时有一个听众,而释放时有另一个听众。如果用户只按下键,myBoolean将以false结尾,因为他们已经放开了键。因此,当myBoolean为false(拍摄)时,我们可以执行一些代码。

**总结:

当按下按键时,

myBoolean为真。所以,如果是真的,我们什么都不做。当用户放开钥匙时,myBoolean为假,在那里,我们会射击太空入侵者。**

答案 1 :(得分:0)

简单,只需要一个布尔变量,只有当它成立时才会使船只射击。然后在空格键中将其设置为true,并在船舶射击时将其设置为false。我不能告诉你如何在你的程序中实现它,因为我不知道你的拍摄方法是如何工作的。但是,如果您要发布导致船舶射击的方法,我可以告诉您如何实施它,或者您可以尝试自己。