我正在为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
答案 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