java - 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 变量根本不是必需的,因为时间增量将考虑它。删除它还可以通过快速按下开火键来防止每 500 毫秒更快地开火,您可能想要也可能不想要。
推荐阅读
- python - 在 Django 1.11 和 django _rest 框架中的嵌套序列化程序上实现更新方法
- java - 从客户端到服务器的频繁 http 调用导致套接字中出现大量 time_wait 状态后,应用程序停止工作
- php - 使用 php 的亚马逊主机中的邮件配置错误?
- ios - iOS 11.3,Watch OS 4.3:在 watchOS 4.3 中获取用户当前位置?
- javascript - 如何为 vue.js 应用程序实现刷新?
- reactjs - Socket IO/React 函数没有检索到正确的值
- angular - 用户创建表单 - 更新和创建 - 使用不同的输入。角 2+
- ubuntu - 某些东西阻止 lftp 连接到远程 FTP 服务器
- xamarin.forms - 本地化在 XamarinForms PCL 中的文化 fr 不起作用
- xcode - 无法附加统一的 iOS 版本