gpt4 book ai didi

java - 比游戏循环更快地检查按键

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:35:46 25 4
gpt4 key购买 nike

我有一个名为Activity 的类,它扩展了JPanel

我的问题是我希望 Activity 每 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
}

目前,该类将按键按下存储在 BitSet 中,每 1000 毫秒,actionPerformed() 查看按下的键(比如将玩家位置移动到右箭头的右侧被按下),处理主游戏循环的东西(比如在边界被击中时结束游戏),并按顺序重绘屏幕。

问题是我必须在计时器触发之前按下一个键才能检测到它,否则它会在 processKeys 时从 BitSet 中删除() 被调用。不过,我仍然希望游戏循环每 1000 毫秒运行一次。

我考虑过

  1. 同时创建 2 个计时器——1000 毫秒用于游戏循环,1 毫秒用于按键分析
  2. 将计时器设置为 1 毫秒,并使用类字段来跟踪计时器触发。每次开火时检查按键,并且仅在 fires % 1000 == 0
  3. 时运行游戏循环/重绘

我不确定 #1 是否会造成性能问题或导致计时器差异,而且我很确定 #2 是不可靠的,因为当我尝试它时,该字段通常不会准确地达到 1000 或 2000 等。

解决方案是什么?

最佳答案

正如您似乎已经发现的那样,由于按下键和处理键之间的延迟很长,因此有可能在处理键之前将键从 BitSet 中删除.

相反,有两个 BitSet,一个用于按下的键,一个用于释放的键,在处理完键后,从“按下的键”中删除“释放的键”集中的所有项目"设置,重置“释放键”设置并继续。

当然,这假定您要处理在进程循环之间的 1 秒延迟期间键入的任何键。

另一种选择可能是实时实际处理关键事件,将它们的影响应用于某种“改变状态”,当过程循环发生时,这种状态可以应用于实际模型,但效果相同

关于java - 比游戏循环更快地检查按键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42959081/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com