2014-09-13 4 views
1

2D 게임용 매크로를 작성하고 있습니다. 문자의 좌표는 (x, y)로 지정됩니다. 게임에 장애물이있어서 캐릭터가 움직이는 방식으로 프로그래밍해야합니다.Autohotkey : 2D 게임에서 프로그래밍하는 방법

그래서 게임의 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

스크립트에서 장애물을 확인하고 있습니까? – MCL

+0

장애물을 모두 피할 수 있도록 코드를 작성합니다. 지도는 무작위가 아니므로 캐릭터를 특정 장소로 ​​이동시켜 피할 수 있도록 할 수 있습니다. –

+0

그 다음 코드의 어느 부분입니까? – MCL

답변

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 
관련 문제