JavaScript游戏开发:用户输入后如何终止setTimeout执行?
解决方案
核心逻辑是将「实时输入响应」和「超时未输入兜底」分开处理,用户输入后立刻反馈,不需要等满1秒窗口:
- 每次时钟跳动结束后,先初始化本轮状态:是否为异常跳动、用户是否已响应、是否处于响应窗口内
- 绑定空格键的按下事件监听,只要在响应窗口内收到有效输入,立刻根据跳动类型执行对应的闪烁逻辑,同时标记用户已响应,避免重复触发
- 保留1秒的
setTimeout作为兜底逻辑,仅当用户在窗口时间内没有任何输入时,再判断是否需要触发漏按的红色闪烁 - 每轮新跳动开始时,必须清除上一轮的定时器和事件监听,避免多轮逻辑互相干扰
你可以参考下面的实现代码调整:
// 保存上一轮的定时器id和事件监听函数,用于清理 let lastInputTimer = null; let lastSpaceListener = null; // 时钟每次跳动后调用该方法,传入当前跳动是否为异常跳动 function handleClockTick(isIrregularTick) { // 先清理上一轮的残留逻辑 if (lastInputTimer) clearTimeout(lastInputTimer); if (lastSpaceListener) document.removeEventListener('keydown', lastSpaceListener); let userHasResponded = false; const RESPONSE_DEADLINE = 1000; // 定义本轮的空格键监听逻辑 lastSpaceListener = (e) => { // 非空格按键、用户已经响应过的情况直接跳过 if (e.code !== 'Space' || userHasResponded) return; userHasResponded = true; // 立刻给出反馈 if (isIrregularTick) { flashScreenGreen(); } else { // 正常跳动下按空格属于误操作,闪红;如果不需要该逻辑可以直接删除 flashScreenRed(); } // 移除本轮监听 document.removeEventListener('keydown', lastSpaceListener); }; // 绑定空格键监听 document.addEventListener('keydown', lastSpaceListener); // 1秒兜底逻辑 lastInputTimer = setTimeout(() => { document.removeEventListener('keydown', lastSpaceListener); // 用户已经响应过就不需要再处理 if (userHasResponded) return; // 异常跳动但用户未按空格,闪红 if (isIrregularTick) { flashScreenRed(); } }, RESPONSE_DEADLINE); }
如果你的需求中正常跳动时用户按下空格不需要给出反馈,只需要删除isIrregularTick为false分支下的flashScreenRed()调用即可。
内容的提问来源于stack exchange,提问作者Kishan
相关产品推荐
相关产品推荐

