【问题标题】:AutoHotKey - Functions cannot contain functions errorAutoHotKey - 函数不能包含函数错误
【发布时间】:2021-02-23 07:16:42
【问题描述】:

我是 AutoHotKey 的新手,我想为 Flash 游戏创建一个脚本宏,但是当我运行它时,它会产生错误。

#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.

condChecker := false
state := true

Mine() 
{
    Sleep, rand(10,80)
    Send, {Space}
    while(state = true) 
        {
                PixelGetColor, gemColor, 982, 433
        if(gemColor = B93557) 
        {
            state := true
        {
        else(gemColor = 96885A) 
        {
            state := false
        }
                Sleep, rand(90,120)
        }
}

^-::
loop 10000 
{
    getState()
    if(state = true) 
        {Mine()}
    else
        {Sleep, rand(70,150)}
}

当我在 ahk 文件上按 Run Script 时,会弹出一个菜单说

第 20 行出错。

其他行文本(gemColor = 96885A) 错误:函数不能包含函数。

程序现在将退出。

我不知道从哪里开始出现这个错误,我在其他论坛上读到说我的格式不正确。

【问题讨论】:

标签: autohotkey


【解决方案1】:

一些不同的事情:

  1. state := true 之后的大括号应该是另一种方式(},而不是 {
  2. AHK 中没有默认的rand 函数,您可能正在寻找Random,或者您有一个名为rand 的自定义函数,但您的问题中没有显示。在任何情况下,我都会编写一个函数rand(a,b),它将返回一个介于 a 和 b 之间的整数值
rand(a, b)
{
    Random, rand, a, b
    return rand
}
  1. 此外,还有另一个函数getState()loop 10000 内被调用。我不确定它应该做什么(或者如果您的意思是 GetKeyState 之类的东西),但我会假设您已经涵盖了这一点。
  2. 正如@Pranav Hosangadi 所提到的,您可能需要else if 语句,而不仅仅是在此行上的else 语句:else(gemColor = 96885A)
  3. 您确定要SendMode Input 吗?尽管它确实比标准Send 具有更高的速度,但它的使用通常仅限于在文本框中输入文本。您似乎正在尝试向 Flash 游戏发送按键,因此您可能需要检查该按键是否按您的预期运行。
  4. 在编写结束大括号 (}) 以结束 if()else() 子句时,您需要将其放在单独的行中。 (即改变
    if(state = true) 
        {Mine()}
    else
        {Sleep, rand(70,150)}

类似

    if(state = true) 
        {
            Mine()
        }
    else
        {
            Sleep, rand(70,150)
        }

甚至(因为这里的ifelse语句只触发一行代码)

    if(state = true) 
        Mine()
    else
        Sleep, rand(70,150)

所以,这有点长,但这是最终代码:

#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
; ---> Double check this! ---> SendMode Input
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.

condChecker := false
state := true

Mine() 
{
    Sleep, rand(10,80)
    Send, {Space}
    while(state = true) 
        {
                PixelGetColor, gemColor, 982, 433
        if(gemColor = B93557) 
        {
            state := true
        }
        else if(gemColor = 96885A) 
        {
            state := false
        }
                Sleep, rand(90,120)
    }
}

rand(a, b)
{
    Random, rand, a, b
    return rand
}

^-::
loop 10000 
{
    ;getState()
    if(state = true) 
        Mine()
    else
        Sleep, rand(70,150)
}

lmk 如果有什么不能正常工作,我会尝试更新这个响应

【讨论】:

  • 感谢您的快速回复。代码运行,但似乎我的逻辑中有一个我不理解的错误。在游戏中,我的角色上方会出现一块宝石。当一块红色的宝石从它里面探出时,你就会知道它里面什么时候有宝石。当你按下空格键时,它会自动直到宝石被开采。开采将继续,直到宝石被开采完或玩家再次按下空间。当带有红色宝石的区域变成棕色时,您将知道宝石已完成开采。该游戏是一款 2D 口袋妖怪 flash 游戏所以宝石
  • 位置将始终保持在同一个位置。当我运行当前程序时,它只是垃圾邮件按空格键。即使查看了我的代码,我也不明白为什么会发生这种情况。如果我知道如何发送屏幕截图我会,但我什至不知道如何回复答案,所以我在这里。
猜你喜欢
  • 2017-11-03
  • 2014-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多