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 毫秒开火更快,您可能想要也可能不想要。
我正在创建一个 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 毫秒开火更快,您可能想要也可能不想要。