오토핫키(AutoHotKey) 기초강좌 #6 - 매크로 만들기 응용 1 (if 응용, CoordMode)




 전체 강좌

 1강 - 오토핫키(AutoHotKey) 소개

 2강 - 프로그래밍의 시작, GUI 만들기

 3강 - 매크로 프로그래밍 1 (Button, Loop, if 사용법)

 4강 - 매크로 프로그래밍 2 (ImageSearch, Send, Sleep)

 5강 - 매크로 프로그래밍 3 (Gui Submit)

 6강 - 매크로 만들기 응용 1 (if 응용, CoordMode)

 7강 - 매크로 만들기 응용 2 (핫키, if 응용)

 8강 - 매크로 만들기 응용 3 (While, GUI와 변수의 활용 1)

 9강 - 매크로 만들기 응용 4 (GUI와 변수의 활용 2)

 10강 - 매크로 만들기 응용 5 (함수1)

 11강 - 매크로 만들기 응용 6 (함수2)

 12강 - 매크로 제작 예제

















안녕하세요 킴영감입니다.


지난 강좌를 끝으로 단순히 ImageSearch와 if를 나열하는 것만으로도 매크로를 만들 수 있다는 것을 배웠습니다.


여기서 만족할 수는 없겠죠?


오늘부터는 조금 더 많은 기능을 추가하기위해 필요한 부분들을 알려드리려고 합니다.


강좌 시작에 앞서 오토핫키 기초강좌의 내용들은 오토핫키 강좌라고 하기 보단 프로그램의 구조를 이해하고 원하는 구조로 프로그램을 만들기 위한 연습을 하게 하는 강좌라고 할 수 있습니다. 내가 구현하고싶은 프로그램의 구조가 어떻게 되는지를 그릴 수 있는 것이 가장 중요합니다. 이 강좌를 보시다보면 그려놓은 그림을 코드로 작성할 때에는 필요한 함수들만 찾아서 그림과 같은 위치에 넣기만 하면 된다는 것을 느끼실 수 있을 것입니다.


그럼 6번째 강좌를 시작하겠습니다.


1. if 응용


3번째 강좌에서 if의 사용방법을 배웠습니다. if는 특정 조건을 만족할 때 중괄호 내부의 코드를 실행하도록 합니다. 


만약 1번 이미지를 찾고 클릭한 뒤에 2번 이미지를 반드시 찾아서 클릭해야 할 때에는 어떻게 해야 할까요? 예를 들면 던전을 도는데 필요한 것 (에너지, 열쇠 등, 게임마다 다르죠...^^)을 모두 소모한 것을 확인했을 때 뒤로가기 버튼을 눌러야 하는 경우가 있겠죠?

이 문제를 해결하기 위해 가장 필요한 것이 순서도 입니다.


1번과 3번 이미지를 반복해서 클릭하고, 1번을 클릭한 뒤에 반드시 2번을 클릭해야하는 작업이 있을 때 아래 그림과 같이 순서도를 그릴 수 있습니다.



1번과 3번이 기본적으로 반복되고 1번을 클릭했을 때에는 2번을 클릭한 뒤 3번을 클릭하도록 작성되었으며 1번클릭에서 No는 이미지를 못찾았을 때를 의미합니다. (원래 이미지를 찾는 부분과 클릭하는 부분을 나누어야하지만 하나로 묶어서 생각할 수 있기 때문에 위와 같이 그렸습니다.)


강좌를 보고 자신이 구현하고 싶은 곳을 대상으로 연습 해 보신분은 쉽게 이해하실 수 있을 것입니다.


그럼 위 순서도를 코드로 작성 해 보겠습니다.


오늘은 새 스크립트를 열어 지난 시간까지 작성한 코드를 복사해 온 뒤, 아래와 같이 수정합니다.



2번 이미지 찾는 부분을 복사해서 1번이미지를 찾고 클릭하는 부분에 붙여 넣었습니다. (반복되는 코드는 붙여넣기로 많이 사용합니다. 단, 위에서 언급한 프로그램의 구조(앞으로는 알고리즘이라고 하겠습니다)를 완벽히 이해하고 순서도를 그릴 수 있다는 가정하에서 이루어 져야 합니다.)


코드를 다시 설명드리면 Loop가 시작된 뒤 1번 이미지를 찾고, 1번 이미지를 찾았으면 좌표를 클릭하고 2번이미지를 찾습니다. 반대로 1번 이미지를 찾고, 1번 이미지를 못찾았으면 if 내부의 코드를 실행하지 않기 때문에 3번 이미지를 찾게 됩니다.


오늘 실습 내용은 2단계(if 내부에 if)까지만 했지만 필요한 만큼 추가하실 수 있으며(if 내부에 if 내부에 if 내부에.....), if 내부에 여러개의 if가 들어갈 수도 있습니다. (직접 테스트 해보시면서 익히시기 바랍니다.)



2. CoordMode


지난 강좌에서 매크로를 실행시키려면 게임화면이 있는 프로그램이 활성화 되어 있어야 한다고 말씀드렸습니다.


그 이유는 오토핫키에서 좌표를 찾을 때에 활성화 된 윈도우에서 찾는 것을 기본 설정으로 하고 있기 때문입니다.


이를 변경할 수 있도록 하는 명령어가 CoordMode입니다. 


좌표를 의미하는 Coordinate의 Mode를 의미합니다. 여기서 잠깐 부연설명을 드리면 거의 모든 명령어는 명령어의 해석적 의미와 같은 기능을 합니다. 프로그래밍이 익숙해 지시면 명령어만 봐도 대략적으로 무슨 동작을 하는 것인지 알 수 있으며 사용 방법만 찾아보고 정해진 방법에 따라 사용하시면 되는 것입니다.


그럼 CoordMode 사용법에 대해 알아보겠습니다.


CoordMode, 타겟, 옵션 


타겟 부분에는 이미지를 찾거나 픽셀을 찾는 것은 Pixel을, 마우스클릭에 관련된 것은 Mouse를 적으시면 됩니다.

옵션 부분에는 활성화된 윈도우에서 찾기 원하면 Window를 전채화면에서 찾기 원하면 Screen을 적으시면 됩니다.


바로 실습을 해 보도록 하겠습니다.


아래와 같이 코드를 작성하세요.



빨간 박스가 있는 부분이 CoordMode를 변경하는 코드입니다.


여기서 코드를 추가한 위치를 주목해 봅시다.


프로그램을 실행시켰을 때 바로 실행되는 부분에 추가해 놓았습니다. (이해가 안되시는 분은 2강을 참고하세요)


CoordMode는 변경된 값을 프로그램이 끝날 때 까지 가지고 있기 때문에 프로그램이 시작할 때 한번만 설정해주면 됩니다. 하지만, 프로그램을 실행시키고 돌아가는 중간중간에 Window와 Screen을 바꾸고 싶으시면 원하는 부분에 추가하시면 됩니다.


CoordMode를 사용해 전채화면에서 이미지를 찾을 때 주의할 점은 게임 화면이 다른 창에 의해 가려져 있으면 안되고, 두개 이상의 모니터를 사용할 경우에는 주 모니터에 게임을 구동하는 창이 있어야 합니다.


이것으로 모든 설명을 마쳤으며 6번째 강의를 마치겠습니다.



이번 강좌부터는 배운 내용을 바탕으로 본인에게 맞는 프로그램을 만들 수 있도록 수정해 가면서 테스트 해보셔야 합니다. 오늘 배우신 if 응용만 활용해도 여러개의 컨탠츠를 돌아가면서 반복하는 매크로 까지는 쉽게 작성할 수 있습니다.


강좌를 보시는 모든 분들이 꼭 성공하기를 바랍니다. 

블로그 이미지

킴영감

프로그래밍과 게임공략, 게임과 관련된 프로그램에 대한 내용을 다룹니다.

댓글을 달아 주세요

  • 김우병아리 2015.09.24 17:31  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 킴영캄님 강의잘보고따라하고있습니다...
    현재 강의보면서 엄청초보적이지만 던전을 계속돌면서 행동력떨어지면 자동으로물약먹고
    다시 던전도는정도까지는 만들었습니다...
    근데 던전몇회이상돌고 퀘스트완료(무한반복퀘스트)하게끔 만들고싶은데
    어찌해야될지모르겟네요 ㅜㅜ 어떤식으로만들어야할까요
    던전몇회클리어시 메인화면으로 복귀해서 퀘스트창클릭 퀘스트완료클릭 다시던전 몇회뺑뺑이이런식으로
    만들고싶은데 어찌해야댈까요...
    Gui, add, text, x30 y5 w110 h20, 매크로 프로그램
    gui, add, text, x60 y25 w50 h20 vA, 준비!!!
    gui, add, text, x60 y50 w50 h20 vB, 0 회
    gui, add, button, x20 y80 w110 h20, 시작
    gui, add, button, x20 y110 w110 h20, 종료
    gui, show

    매크로시작 := false

    return

    button시작:
    {
    매크로시작 := ture
    Loop
    {
    ;여기에 무한 반복할 작업의 코드를 작성합니다.
    ImageSearch, FoundX, FoundY, 0,0, A_Screenwidth, A_ScreenHeight, *50 %A_ScriptDir%\Image\1.png
    if (Errorlevel = 0)
    {
    send {Click %FoundX% %FoundY%} ;찾은 좌표를 클릭합니다.
    Sleep, 1000 ; ms단위
    }
    ImageSearch, FoundX, FoundY, 0,0, A_Screenwidth, A_ScreenHeight, *50 %A_ScriptDir%\Image\2.png
    if (Errorlevel = 0)
    {
    send {Click %FoundX% %FoundY%} ;찾은 좌표를 클릭합니다.
    Sleep, 1000 ; ms단위
    }
    ImageSearch, FoundX, FoundY, 0,0, A_Screenwidth, A_ScreenHeight, *50 %A_ScriptDir%\Image\3.png
    if (Errorlevel = 0)
    {
    send {Click %FoundX% %FoundY%} ;찾은 좌표를 클릭합니다.
    Sleep, 1000 ; ms단위
    }
    ImageSearch, FoundX, FoundY, 0,0, A_Screenwidth, A_ScreenHeight, *50 %A_ScriptDir%\Image\4.png
    if (Errorlevel = 0)
    {
    send {Click %FoundX% %FoundY%} ;찾은 좌표를 클릭합니다.
    Sleep, 1000 ; ms단위
    }
    ImageSearch, FoundX, FoundY, 0,0, A_Screenwidth, A_ScreenHeight, *50 %A_ScriptDir%\Image\5.png
    if (Errorlevel = 0)
    {
    send {Click %FoundX% %FoundY%} ;찾은 좌표를 클릭합니다.
    Sleep, 1000 ; ms단위
    }
    ImageSearch, FoundX, FoundY, 0,0, A_Screenwidth, A_ScreenHeight, *50 %A_ScriptDir%\Image\6.png
    if (Errorlevel = 0)
    {
    send {Click %FoundX% %FoundY%} ;찾은 좌표를 클릭합니다.
    Sleep, 1000 ; ms단위
    }
    ImageSearch, FoundX, FoundY, 0,0, A_Screenwidth, A_ScreenHeight, *50 %A_ScriptDir%\Image\7.png
    if (Errorlevel = 0)
    {
    send {Click %FoundX% %FoundY%} ;찾은 좌표를 클릭합니다.
    Sleep, 1000 ; ms단위
    }
    if(매크로시작 = false)
    {
    break
    }
    }

    }
    return

    button종료:
    {
    매크로시작 := false
    ExitApp
    }
    return

    그냥 킴영캄님꺼그대로 쓰고잇다고보시면될듯하네요 ㅠㅠ
    만약 3번이 전투시작이라면 전투시작몇번클릭후 횟수채워지면 메인화면복귀후퀘스트완료 이런식으로해야되는건가요...너무어렵네요...ㅋㅋ