首页 > 解决方案 > Java 2D 游戏中的射速问题

问题描述

我正在创建一个 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();
    }

}

标签: java2d-games

解决方案


我怀疑这是键重复的问题,它会在按住键时重复调用 KeyPressed。它通常设置为按照您的描述行事。因此,“firstShot”将被重复设置为 true,并且会发射一枪。

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

但是,firstShot 变量根本不是必需的,因为时间增量将考虑它。删除它还可以通过快速按下开火键来防止每 500 毫秒更快地开火,您可能想要也可能不想要。


推荐阅读