Autohotkey:如何编程走进2D游戏

时间:2014-09-13 16:02:55

标签: macros autohotkey

我正在为2D游戏编写一个宏。在(x,y)中给出角色的坐标。游戏中存在障碍,因此我需要以角色围绕它移动的方式进行编程。

所以我写了一个程序来读取游戏的x和y坐标的内存。然后我写了一个函数,将角色移动到所需的位置。逻辑是:如果x坐标小于所需位置,则继续向右移动,反之亦然。然后,如果y坐标小于所需位置,则继续向上移动,反之亦然。

然而,由于障碍,我必须手动给坐标移动。例如,如果我在(1,1),并告诉角色移动到(5,5),则(3,1)可能存在障碍,角色将被卡住。所以我会先告诉它(1,3),然后转到(5,3),然后转到(5,5)。

我只是对如何顺序告诉角色移动感到困惑。在我转移到(1,3)之后,转到(5,3),然后转到(5,5)。

这就是我所拥有的:

    f1::

WinGetTitle, ai, A
curX := ReadMemory(0x10F6A7D0, ai)
curY := ReadMemory(0x10F6A7D4, ai)

MoveTo(21,13)
if(curX == 21 && curY == 13){
    MoveTo(21,28)
}

return


q::

Pause

return


ReadMemory(MADDRESS,PROGRAM)
{
winget, pid, PID, %PROGRAM%

VarSetCapacity(MVALUE,4,0)
ProcessHandle := DllCall("OpenProcess", "Int", 24, "Char", 0, "UInt", pid, "UInt")
DllCall("ReadProcessMemory","UInt",ProcessHandle,"UInt",MADDRESS,"Str",MVALUE,"UInt",4,"UInt *",0)

Loop 4
result += *(&MVALUE + A_Index-1) << 8*(A_Index-1)

return, result  
}



MoveTo(targetX,targetY)
{

xadd = 0x10F6A7D0
yadd = 0x10F6A7D4

WinGetTitle, ai, A

Loop{
    curX:= ReadMemory(xadd,ai)
    curY:= ReadMemory(yadd,ai)

    if(curX < targetX){
        ControlSend,, {Right}, %ai%
    }
    else if(curX > targetX){
        ControlSend,, {Left}, %ai%
    }
    else if(curY < targetY){
        ControlSend,, {Down}, %ai%
    }
    else if(curY > targetY){
        ControlSend,, {Up}, %ai%
    }
Sleep, 30

1 个答案:

答案 0 :(得分:1)

好的,所以我解决了我的问题。我只需要在MoveTo函数中进行while循环,并在到达该位置时终止它。

MoveTo(targetX,targetY)
{

xadd = 0x10F6A7D0
yadd = 0x10F6A7D4

WinGetTitle, ai, A
isThere := 1

while(isThere = 1){
    curX:= ReadMemory(xadd,ai)
    curY:= ReadMemory(yadd,ai)

    if(curX < targetX){
        ControlSend,, {Right}, %ai%
    }
    else if(curX > targetX){
        ControlSend,, {Left}, %ai%
    }
    else if(curY < targetY){
        ControlSend,, {Down}, %ai%
    }
    else if(curY > targetY){
        ControlSend,, {Up}, %ai%
    }

    if(curX = targetX && curY = targetY){
          isThere = 0
     }
Sleep, 30