Java 2D游戏中的射击率问题

时间:2018-11-10 09:57:47

标签: java 2d-games

我正在创建2D坦克游戏,我希望我的坦克能够在按下开火按钮后立即射击,然后在按住开火按钮的同时每半秒射击一次。目前,在我的游戏中,按下发射按钮后,我的第一枚子弹会立即射击,然后会有一段时间(我猜是半秒钟),直到我的坦克开始发射子弹为止。我想知道为什么第一个项目符号之后的初始延迟有效,但后续项目失败。下面,我包括了创建子弹的方法,该方法在我的144Hz主游戏循环中称为每一帧:

public void addBullets(ArrayList<Animate> animates, ArrayList<Drawable> drawables){
    if (this.ShootPressed) {
        if( firstShot || (System.currentTimeMillis() - timeSinceLastShot) >= 500) {
            Bullet newBullet = this.addBullet();
            animates.add(newBullet);
            drawables.add(newBullet);
            firstShot = false;
            timeSinceLastShot = System.currentTimeMillis();
        }
    }
} 

这是我的KeyListener类中的关联方法:

public void keyPressed(KeyEvent key) {
    int keyPressed = key.getKeyCode();
    if (keyPressed == up) {
        this.t1.toggleUpPressed();
    }
    if (keyPressed == down) {
        this.t1.toggleDownPressed();
    }
    if (keyPressed == left) {
        this.t1.toggleLeftPressed();
    }
    if (keyPressed == right) {
        this.t1.toggleRightPressed();
    }
    if(keyPressed == shoot) {
        this.t1.toggleShootPressed();
        this.t1.setFirstShot(true);
    }

我将其包括在内以获取更多信息,即使该错误发生在释放密钥之前:

public void keyReleased(KeyEvent ke) {
    int keyReleased = ke.getKeyCode();
    if (keyReleased  == up) {
        this.t1.unToggleUpPressed();
    }
    if (keyReleased == down) {
        this.t1.unToggleDownPressed();
    }
    if (keyReleased  == left) {
        this.t1.unToggleLeftPressed();
    }
    if (keyReleased  == right) {
        this.t1.unToggleRightPressed();
    }
    if (keyReleased  == shoot) {
        this.t1.unToggleShootPressed();
    }

}

1 个答案:

答案 0 :(得分:0)

我怀疑这是键重复的问题,在按住键时会重复调用KeyPressed。通常将其设置为按照您描述的方式运行。因此,“ firstShot”将被重复设置为true并会开火。

我建议将事件代码(主要是因为它本质上是连续的)限制为仅切换动作,而不是执行任何逻辑。您可以借助事件中的一些消息来确定镜头是否在游戏循环中居首位。

但是,因为时间增量会占用它,所以firstShot变量实际上根本不是必需的。删除它还可以通过快速按下发射键来防止发射,发射速度超过每500毫秒一次。