发表回复 
游戏中多个热键快速切换,不卡不失效
2017-07-29, 18 : 13 (这个帖子最后修改于: 2017-08-05 23 : 30 by feiyue.)
Heart 游戏中多个热键快速切换,不卡不失效
大家在玩一些游戏时,最常使用的热键功能是:按住热键立即开始某个
连续的按键循环,松开热键停止这个循环。如果仅有一个热键还没问题,
但是如果同时启用多个热键,就会经常遇到热键失效了,卡顿了等情况。

因为新热键启动的线程并不能终止前一个热键的线程,只能中断挂起原来
的线程(原来的热键就失效了),而且松开热键时线程也不会立即终止,
会等本次循环执行完毕再停止(停止前再按这个热键时会卡顿)。

为了让松开热键立即终止线程(本次循环的后续动作不再执行),
而且多个热键任意切换时,不造成互相中断、卡顿,我提供了如下
的热键方案,朋友们使用这个方案,可以畅快地随意切换热键并立即执行。

代码: (全选)
/*
-------------------------------------------
  【游戏中多个热键快速切换,不卡不失效】

  作者:FeiYue

  使用方法:(请参照下面的例子)

    1、热键仅启动:GoWait( 要运行的标签, 等待松开的按键 )
       热键的执行代码使用另外的标签,由GoWait启动

    2、每行都插入:Sleep( 毫秒 )
       有延时的都用Sleep( 毫秒 ),不延时的也用Sleep( 0 )
-------------------------------------------
*/

;-- 热键启动函数,可以发送指令给延时函数和背景循环
GoWait(label="", key="") {
  global RunLabel, DoExit
  static MainLoopStart, WaitKey
  Critical
  if (RunLabel = label)
    return
  if (MainLoopStart="")
  {
    MainLoopStart:=1
    SetTimer, MainLoop, -1, -1
  }
  RunLabel:=label, DoExit:=1, WaitKey:=key
  SetTimer, WaitKeyUp, % key="" ? "Off":10
  return
  WaitKeyUp:
  ListLines, Off
  Critical
  if not GetKeyState(WaitKey, "P")
  {
    RunLabel:="", DoExit:=1
    SetTimer,, Off
  }
  return
  ;-- 背景循环,接受指令可以立即启动新线程
  MainLoop:
  ListLines, Off
  Loop {
    if IsLabel(RunLabel)
    {
      DoExit:=0
      SetTimer, %RunLabel%, -1
    }
    Sleep, 10
  }
  return
}

;-- 延时函数,接受指令可以立即终止本线程
Sleep( MS=0 ) {
  global DoExit
  ListLines, Off
  IfEqual, DoExit, 1, Exit
  if MS>0
  {
    endt := A_TickCount + MS
    While (A_TickCount < endt)
    {
      Sleep, 10
      IfEqual, DoExit, 1, Exit
    }
  }
  ListLines, On
}


;==== 上面的函数加入自己的脚本中,下面的例子不用加 ====


;-- 按住1循环发送abc,松开停止
$1:: GoWait("aaa1", "1")

aaa1:
Loop {
  Sleep( 0 )
  Send a
  Sleep( 100 )
  Send b
  Sleep( 100 )
  Send c
  Sleep( 100 )
}
return


;-- 按住2循环发送xyz,松开停止
$2:: GoWait("aaa2", "2")

aaa2:
Loop {
  Sleep( 0 )
  Send x
  Sleep( 100 )
  Send y
  Sleep( 100 )
  Send z
  Sleep( 100 )
}
return


;-- 按一次3循环发送789,再按一次停止
$3:: (RunLabel!="aaa3") ? GoWait("aaa3") : GoWait()

aaa3:
Loop {
  Sleep( 0 )
  Send 7
  Sleep( 100 )
  Send 8
  Sleep( 100 )
  Send 9
  Sleep( 100 )
}
return


;-- 按下Esc退出测试
Esc::ExitApp


;
查找这个用户的全部帖子
表示感谢 引用并回复 移动视图置页面顶端
[+] 1用户表示感谢feiyue
发表回复 


论坛跳转:


联系我们 | Autohotkey 中文站 | 回到顶部 | 回到正文区 | 精简(归档)模式 | RSS 聚合