我正在创建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();
}
}
答案 0 :(得分:0)
我怀疑这是键重复的问题,在按住键时会重复调用KeyPressed。通常将其设置为按照您描述的方式运行。因此,“ firstShot”将被重复设置为true并会开火。
我建议将事件代码(主要是因为它本质上是连续的)限制为仅切换动作,而不是执行任何逻辑。您可以借助事件中的一些消息来确定镜头是否在游戏循环中居首位。
但是,因为时间增量会占用它,所以firstShot变量实际上根本不是必需的。删除它还可以通过快速按下发射键来防止发射,发射速度超过每500毫秒一次。