我有一个游戏,你可以通过在按下键时将子弹添加到Controller类来发射子弹。这是代码 来自KeyPressed();
else if (key == KeyEvent.VK_Q && !is_shooting)
{
is_shooting = true;
c.addBullet(new Bullet(p.getX(), p.getY(), this));
}
来自KeyRealeased的:
else if (key == KeyEvent.VK_Q)
{
is_shooting = false;
}
按原样,您可以根据需要进行拍摄,is_shooting只需按住按键即可停止。我希望它能让你在拍摄之后有一个冷却时间才可以拍下你的下一个镜头。我尝试使用Thread.Sleep,但这也会使角色在冷却期间无法移动。任何帮助表示赞赏。
答案 0 :(得分:1)
您的代码看起来来自Swing GUI - 您没有说,但确实应该是关键信息,如果不是,则会完全改变方法。如果这是真的,那么不要使用Thread.sleep
,因为如果在GUI上调用事件线程会使整个GUI进入休眠状态,使其无效。而是使用Swing Timer(请查看Swing Timer Tutorial了解更多信息)。而不是for循环,Timer的ActionListener的actinPerformed方法将被重复调用,直到你在Timer 上调用stop()
。
方面问题:如果这是一个Swing GUI,你最好使用Key Bindings而不是KeyListener。更多相关内容:Key Bindings Tutorial
答案 1 :(得分:1)
如果有这么少的背景,很难100%成为最直接问题的最佳解决方案。
我过去做过的一件事是,记录触发特定事件的时间,将时间差异与上次触发时间进行比较,如果某个时间阈值已经过去,请允许操作发生,否则忽略它
像...一样的东西。
long timeNow = System.currentTimeMillis();
long time = timeNow - timeOfLastProjectile;
if (time < 0 || time > 1000) {
timeOfLastProjectile = timeNow;
// Trigger associated action
}
作为一个例子。
我可能会使用这种方法的一个原因是,如果我有很多需要处理的传入事件,并且不想启动新线程或Timer
以管理系统资源,但是这种决定需要额外的问题背景。
同意Hovercraft Full Of Eels,您最好使用Key Bindings API