如何解决Lua游戏连点脚本松开按键后repeat循环不停止的问题?
问题根因
偶发松开左键后脚本仍继续运行的核心原因有两个:
- 原有逻辑中单次Sleep时长最长达60ms,用户松开左键的动作如果刚好发生在Sleep周期内,脚本无法及时检测到按键状态变化
IsMouseButtonPressed(1)会同时识别物理按键按下和脚本模拟触发的按键按下,当检测时机刚好落在脚本模拟按下左键的窗口时,即使用户已经松开物理按键,也会被误判为仍处于按下状态,导致循环无法退出
修复后完整代码
EnablePrimaryMouseButtonEvents(true); -- 封装统一的停止条件检测逻辑 local function CheckStop() -- 停止触发条件:松开左键/按下Shift/按下R键 return not IsMouseButtonPressed(1) or IsModifierPressed("shift") or IsKeyPressed("r") end function OnEvent(event, arg) if IsKeyLockOn("capslock") then if IsMouseButtonPressed(1) then repeat -- 每次操作前先检测停止条件 if CheckStop() then break end -- 把长Sleep拆分为10ms小段,每段结束都检测状态,最长10ms即可响应停止操作 for i = 1, math.random(3,6) do Sleep(10) if CheckStop() then break end end if CheckStop() then break end PressMouseButton(1) for i = 1, math.random(3,6) do Sleep(10) if CheckStop() then ReleaseMouseButton(1) break end end if CheckStop() then ReleaseMouseButton(1) break end ReleaseMouseButton(1) until CheckStop() -- 退出循环后强制释放左键,避免卡按键 ReleaseMouseButton(1) end end end
改动说明
- 新增统一的停止判断函数,同时覆盖松开左键、按下Shift、按下R键三个退出场景
- 所有长Sleep都拆分为10ms的小片段,避免长Sleep期间漏检测按键变化
- 循环每个关键节点都加了停止判断,触发停止时会强制释放左键,不会出现模拟按键卡住的问题
- 如果R键检测无响应,可将
IsKeyPressed("r")替换为IsKeyPressed(0x52)使用虚拟键码检测
内容的提问来源于stack exchange,提问作者AAAa aA
相关产品推荐
相关产品推荐

