Java 2D 游戏中的射速问题

Fire Rate Issue in Java 2D Gaming

我正在创建一个 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 class 中的关联方法:

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();
    }

}

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

我建议限制您的事件代码,主要是因为它本质上是连续的,只用于切换操作,而不是执行任何逻辑。借助事件中的一些消息,您可以确定在游戏循环中是否先击球。

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