我不知道我的AHK脚本有什么问题

时间:2020-07-31 20:12:53

标签: arrays syntax autohotkey

我在这里进行了很多我不熟悉的工作,因此即使阅读了文档并尝试了大约一个小时的修复,我仍然找不到问题。

目标是从文件中一次获取屏幕坐标和十六进制颜色,然后检查屏幕以查看它们是否匹配。如果没有,请单击这些坐标。最初,我只是每次迭代都重复读取该文件,并且我认为它起作用,除了它产生了无法使用的滞后量,所以我不确定。我遇到的麻烦以及最终使用的代码是here。这就是为什么现在我要在启动时从文件在内存中创建表并改为使用它的原因。这是我正在使用的文件:

1123 680 0x201F42 
1178 679 0x0B3D55 
1232 679 0x12352D 
1286 680 0x0F211E 
1344 681 0x231D30 
1396 680 0x22171D 
1454 680 0x392E30 

这是我的代码:

Loop, Read, % "out.txt"
{
    l := A_Index
    for k, v in StrSplit(A_LoopReadLine, A_Space)
    {
        table[l,k] := v
    }
}

Loop
{
    if (GetKeyState("Space"))
    {
        for k, v in table
        {
            PixelGetColor, hue, % v[0], % v[1]
            if (hue != v[2])
            {
                Click, % v[0] ", " v[1]
            }
        }
    }
    Sleep, 20
}

我目前唯一能看到的问题是第二个for块中什么都没有执行。我尝试查找错误,但是到目前为止,我一直没有成功。阅读文档并不能给我一个明确的答案,甚至不能为我指出一个有用的方向,这就是我在这里问的原因。

1 个答案:

答案 0 :(得分:2)

您似乎正在尝试创建一个multidimensional array,如果您首先将table定义为数组或对象,这将起作用。
因此,例如,只需在脚本顶部添加一个简单的table := []即可。
然后您将得到以下结果:
Variable Inspection

您还将注意到AHK中的数组是如何基于1的,而不是像许多其他语言中的基于0的数组。
当我较早修复您的其他脚本时,错过了这一点,因此也需要修复。

此外,不确定是否知道,但是PixelGetColor返回BGR格式的颜色。不在RGB中。因此,首先要假设这是一个问题,就需要修复。
因此,假设您的颜色0x201F42为RGB,则BGR为0x421F20

而且,您是否知道坐标将相对于活动窗口?
如果您不想这样做,请指定CoordMode, Pixel, Screen,以使坐标相对于整个屏幕。


这是您的脚本,其中添加了table := [],索引已更改为基于1的脚本。 希望我不会错过任何东西,我无法真正测试它。
不过,我猜测延迟会带来一些问题。点击之间没有延迟可能不会起作用。在Sleep命令下尝试Click
空格键检查循环之间的20ms延迟也很短。可能不会产生好的结果。

table := []
Loop, Read, % "out.txt"
{
    l := A_Index
    for k, v in StrSplit(A_LoopReadLine, A_Space)
    {
        table[l,k] := v
    }
}

Loop
{
    if (GetKeyState("Space"))
    {
        for k, v in table
        {
            PixelGetColor, hue, % v[1], % v[2]
            if (hue != v[3])
            {
                Click, % v[1] ", " v[2]
            }
        }
    }
    Sleep, 20
}