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

我怀疑这是密钥重复的问题,它会在持有密钥时重复调用KeyPressed。它通常设置为按照您描述的方式进行操作。因此,"firstShot"将被重复设置为true,并将发射一次射击。

我建议将事件代码限制为仅切换操作,而不是执行任何逻辑,主要是因为它本质上是连续的。您可以通过事件中的一些消息来确定一次射击是否是游戏循环中的第一次。

然而,firstShot变量并不是真正必要的,因为时间增量会解释它。删除它也会阻止快速按下fire键以超过每500ms的速度开火,这可能是你想要的,也可能不是。

最新更新