Java 8游戏开发中如何实现按住按键时对应事件仅触发一次
实现方案
核心是通过维护按键的按下状态,过滤操作系统触发的重复按下/松开事件,只响应首次按下动作。
步骤1:在你的类中添加按键状态存储变量
使用Set存储当前已按下的按键编码,避免重复触发:
// 存储已经按下的按键code,Set天然去重 private final Set<Integer> pressedKeys = new HashSet<>();
步骤2:重写keyPressed方法处理首次按下逻辑
把打印逻辑移到keyPressed里,只有首次按下时才执行:
public void keyPressed(KeyEvent e) { int keycode = e.getKeyCode(); // 只有该按键没有被记录过(首次按下)才执行操作 if (!pressedKeys.contains(keycode)) { pressedKeys.add(keycode); switch(keycode) { case KeyEvent.VK_LEFT: // 对应原代码的37,用常量可读性更强 System.out.println("left"); break; case KeyEvent.VK_RIGHT: // 对应原代码的39 System.out.println("right"); break; case KeyEvent.VK_UP: // 对应原代码的38 System.out.println("up"); break; case KeyEvent.VK_DOWN: // 对应原代码的40 System.out.println("down"); break; } } }
步骤3:修改keyReleased方法清理状态
松开按键时把对应编码从Set中移除,下次按下可以重新触发:
public void keyReleased(KeyEvent e) { int keycode = e.getKeyCode(); pressedKeys.remove(keycode); }
补充说明
受操作系统按键重复机制的影响,按住按键可能会导致多次调用keyPressed()(以及keyReleased())。重复触发速率由操作系统及电脑配置决定。
上述方案通过状态标记的方式直接忽略重复的按下事件,完全规避了系统配置导致的重复触发问题,同时支持多按键同时按下的场景。推荐用KeyEvent内置常量代替魔法数字,避免写错编码的问题。
内容的提问来源于stack exchange,提问作者AAAAAAbc
相关产品推荐
相关产品推荐

