Java 检查按键是否比游戏循环快
我有一个名为Java 检查按键是否比游戏循环快,java,swing,user-interface,timer,Java,Swing,User Interface,Timer,我有一个名为Activity的类,它扩展了JPanel 我的问题是,我希望活动每1000毫秒运行一次游戏循环(更新其字段和GUI等),但总是检查(以便响应)按键 private final BitSet keys = new BitSet(256); ... public void keyPressed(final KeyEvent e) { keys.set(e.getKeyCode()); } public void keyReleased(final KeyEvent e)
Activity
的类,它扩展了JPanel
我的问题是,我希望活动
每1000毫秒运行一次游戏循环(更新其字段和GUI等),但总是检查(以便响应)按键
private final BitSet keys = new BitSet(256);
...
public void keyPressed(final KeyEvent e) {
keys.set(e.getKeyCode());
}
public void keyReleased(final KeyEvent e) {
keys.clear(e.getKeyCode());
}
...
public void actionPerformed(ActionEvent e) {
processKeys(); // Checks keys
processData(); // Main game loop
repaint(); // Draws game components
}
目前,该类将按键存储在位集中,并且每隔1000毫秒,actionPerformed()
查看按下的按键(如将玩家位置移动到右箭头的右侧),处理主要的游戏循环内容(如在命中边界时结束游戏),并按该顺序重新绘制屏幕
问题是,我必须在计时器启动之前按下一个键才能检测到它,否则在调用processKeys()
时,它将从位集中删除。我仍然希望游戏循环每1000毫秒运行一次
我也考虑过
创建2个同步计时器——1000毫秒用于游戏循环,1毫秒用于按键分析
将计时器设置为1ms,并使用类字段跟踪计时器触发。Check键在每次开火时按下,并且仅在开火%1000==0时运行游戏循环/重新绘制
我不确定#1是否会造成性能问题或导致计时器不一致,我也很确定#2不可靠,因为当我尝试过它时,字段通常不会精确地达到1000或2000等
解决方案是什么?正如您所发现的,由于按键和处理按键之间的延迟太长,因此可以在处理按键之前将其从位集中删除
相反,使用两个位集
s,一个用于按下键,一个用于释放键,在处理键后,从“按下键”集中删除“释放键”集中的所有项目,重置“释放键”集并继续
当然,这是假设您想要处理在进程循环之间的1秒延迟期间键入的任何键
另一种选择可能是实时实际处理关键事件,将其影响应用于某种“更改状态”,当流程循环发生时,可以将其应用于实际模型,但这与回答相同。我会试试你列出的第一个选项。至于第二个选项,我过去经常这样做,但根据下面的和,我觉得这是一个糟糕的事件处理实践。所以这真的不是“同一件事”,对吗?