//没登陆

欢迎您来到凯恩之角,奈非天!

帖子:1310

符文:62

跳转到指定楼层
1#
发表于 2019-12-16 22:06:00 |只看该作者 |倒序浏览 来自:河北
没系统研究过罗技的lua编程,从其他大神的帖子里学着编点自己用的简单的宏,解放老年人酸痛的手。

最主要是分别按照固定时间按各个技能键,但出现了设置时间与预期不一致的问题,差了接近一倍,请老司机、大神们指点:


(前面有宏变量说明 time_interval=10 (单位是毫秒))

while (IsKeyLockOn("capslock"))  do
        Sleep(time_interval) --循环间隔

        Times_Key_1 = Times_Key_1 + 1
        Times_Key_3 = Times_Key_3 + 1
        Times_Key_4 = Times_Key_4 + 1
        
      
        --每0.5秒按下并释放1键
        if ((Times_Key_1*time_interval) == 500) then
            PressAndReleaseKey("1")
            Times_Key_1 = 0
        end

        --每4.1s按下3键
        if ((Times_Key_3*Barbarian_Macro_LoopInterval) == 4100) then
            PressAndReleaseKey("3")
            Times_Key_3 = 0
        end

        --每5s按下4键
        if ((Times_Key_4*time_interval) == 5000) then
            PressAndReleaseKey("4")
            Times_Key_4 = 0
      
     end

        以上就是主要循环按键部分,游戏中使用结果是,1,3,4三个按键可以各自循环按下,但时间间隔基本是设定值的2倍左右。不是程序猿,原谅我大学学的那点编程记忆不知道还给谁了,这段循环怎么都看不出哪出来的2倍时间。
tag:chengzi#41338
头像被屏蔽

帖子:1890

符文:91

2#
直接录制不简单?3个键录3个简单无脑
发表于 2019-12-16 23:28:53 来自凯恩之角App |只看该作者 来自:青海

帖子:1310

符文:62

3#
原来也是录制,但还是不够灵活
发表于 2019-12-17 06:33:21 来自凯恩之角App |只看该作者 来自:河北

帖子:3764

符文:396

4#
不要==,用>=即可
发表于 2019-12-17 08:27:25 |只看该作者 来自:北京

帖子:1310

符文:62

5#
絕對水餃 发表于 2019-12-17 08:27
不要==,用>=即可

对啊,错过了一次判断就多了一倍时间,果然是有经验的大神,感谢!


可为什么总是稳定错过一次呢?

发表于 2019-12-17 10:31:57 来自凯恩之角App |只看该作者 来自:北京

帖子:42

符文:37

6#
这个写法我用过,原因就是几个键要前后一起按下,中间没有延时会出现不按某些键的bug。后来在每次按下和弹起分开才行,之间和之后都加sleep(50),虽然这样不准确,但是要求不高的情况下没有bug。
发表于 2019-12-17 10:57:59 |只看该作者 来自:浙江

帖子:2226

符文:12

7#
一个键有按下和弹起两个动作,如果时间太短D3会识别不到,所以每个操作还是得有时间间隔
发表于 2019-12-17 13:16:18 |只看该作者 来自:北京

帖子:1310

符文:62

8#
小家伙华仔1 发表于 2019-12-17 10:57
这个写法我用过,原因就是几个键要前后一起按下,中间没有延时会出现不按某些键的bug。后来在每次按下和弹 ...

谢谢6楼和7七楼两位兄弟。


按下抬起分开,是指PressAndReleaseKey命令拆成 PressKey和ReleaseKey吗  ?延迟加在哪个环节合适呢?刚才试了一下没有改善

发表于 2019-12-17 20:51:05 |只看该作者 来自:河北
tag:chengzi#41338

帖子:251

符文:46

9#
这和那个什么精灵有什么差别,
发表于 2019-12-17 21:00:50 来自凯恩之角App |只看该作者 来自:四川

帖子:921

符文:38

10#
你这个是单线程的,所以>=和==没有区别。
问题在于你一个循环sleep10ms,运行其他语句时间也差不多10ms了
发表于 2019-12-21 18:41:58 来自凯恩之角App |只看该作者 来自:江苏

帖子:921

符文:38

11#
解决方案1:加大timeinterval,减少其他语句运行时间占比
2:像水饺一样写自己的时间函数,通过读取系统时间做差获得准确的间隔
发表于 2019-12-21 18:44:23 来自凯恩之角App |只看该作者 来自:江苏

帖子:873

符文:171

12#
本帖最后由 绝非偶然5665 于 2019-12-21 19:21 编辑

论坛发宏基本都不是程序员,专业程序员发的根本看不懂,别问我怎么知道。
你不用GetRunningTime()轮询对照是不可能有准确度可言的,Sleep()有很大误差,重复执行误差累计起来就boom。
仅供参考:
  1. local time_interval=10
  2. local key1_interval = 500
  3. local key3_interval = 4100
  4. local key4_interval = 5000


  5. local function InitWait()
  6.         local start_time = GetRunningTime()
  7.         local key1_time, key3_time, key4_time, running_time = -10000, -10000, -10000, 0
  8.         local current_time = GetRunningTime()
  9.         return function(time)
  10.                 while current_time - start_time < running_time + time and IsKeyLockOn("capslock")
  11.                 do
  12.                         Sleep(time_interval)
  13.                         current_time = GetRunningTime()
  14.                         if current_time - key1_time > key1_interval then
  15.                                 PressAndReleaseKey("1")
  16.                                 key1_time = GetRunningTime()
  17.                         end
  18.                         if current_time - key3_time > key3_interval then
  19.                                 PressAndReleaseKey("3")
  20.                                 key3_time = GetRunningTime()
  21.                         end
  22.                         if current_time - key4_time > key4_interval then
  23.                                 PressAndReleaseKey("4")
  24.                                 key4_time = GetRunningTime()
  25.                         end
  26.                 end
  27.                 running_time = running_time + time
  28.         end
  29. end

  30. local function Light()
  31.         if not IsKeyLockOn("capslock") then
  32.                 PressAndReleaseKey("capslock")
  33.         end
  34. end

  35. function OnEvent(event, arg)
  36.         if event == "MOUSE_BUTTON_PRESSED" and arg == 4 then
  37.                 Light()
  38.                 Sleep(50)
  39.                 local Wait = InitWait()
  40.                 while IsKeyLockOn("capslock")
  41.                 do
  42.                         Wait(10000)
  43.                 end
  44.                 ReleaseKey("1", "3", "4")
  45.       end
  46. end
复制代码


发表于 2019-12-21 19:12:31 |只看该作者 来自:上海

帖子:1310

符文:62

13#
学习中,逐渐对lua有点初步了解了,感谢大家~
发表于 2019-12-21 20:07:00 |只看该作者 来自:河北
tag:chengzi#41338

帖子:5855

符文:75

14#
絕對水餃 发表于 2019-12-17 08:27
不要==,用&gt;=即可

惊现宏大佬,大佬可以摸摸你的鼠标吗
发表于 2019-12-21 20:36:26 来自凯恩之角App |只看该作者 来自:重庆
头像被屏蔽

帖子:2940

符文:187

15#
用按键精零有什么区别
发表于 2019-12-21 21:09:14 来自凯恩之角App |只看该作者 来自:福建
您需要登录后才可以回帖 登录 | 注册网易通行证