방개
비밀번호를 잊어버리셨나요?

질문

전체적으로 한번 봐주세요

    • 글자 크기

안녕하세요. 소스 전체적으로 올려봅니다.

되긴되는거 같은데 뭔가 됬다 안됬다 그러는거 같아

뭐가 잘못된지 모르겠네요 ㅠㅠ

 

이미지서치 J1~J5 서치 후 확인되면 - ITEM 넘어가서 이미지서치 후 마우스 드래그 옴긴 후 - OK 넘어가서 이미지 클릭

하려고 만들려고 합니다.

근데 이게 테스트 해보니 됬다 안됬다 그럽니다.

뭐가 잘못된건데, 초보라서 어떻게 해야할지 질문드립니다.

문제점은  J1~J5 서치 잘 되어 - ITEM 넘어갔다가 OK 로 넘어가야되는데 무시 할떄가 있고

J1~J5 서치 하다가 ITEM 넘어갔다가 OK 로 안넘어가고 다시 처음 J1~J5 서치 할때가 있습니다.

그리고 J1~J5 이미지가 없으면 마우스 이동   782,321 좌표로 이동하여 클릭이 됬다 안됬다 할떄도

중간중간 생략되는 부분이 있어서 딜레이를 안줘서 그런건지;;

전체적으로 뭐가 문제인지 한번 봐주세요 ㅠㅠ


 

 

 

SetDefaultMouseSpeed,5
home::
loop
{
    ImageSearch, px, py, 638,81,767,418, *15 j1.png
    if (errorlevel = 0)
    {
        MouseClick,l, %px%, %py%,,,D
    gosub,ITEM
}

    ImageSearch, px, py, 638,81,767,418, *15 j2.png
    if (errorlevel = 0)
    {
        MouseClick,l, %px%, %py%,,,D
    gosub,ITEM
}

    ImageSearch, px, py, 638,81,767,418, *15 j3.png
    if (errorlevel = 0)
    {
        MouseClick,l, %px%, %py%,,,D
    gosub,ITEM
}
    
    ImageSearch, px, py, 638,81,767,418, *15 j4.png
    if (errorlevel = 0)
    {
        MouseClick,l, %px%, %py%,,,D
    gosub,ITEM
}

    ImageSearch, px, py, 638,81,767,418, *15 j5.png
    if (errorlevel = 0)
    {
        MouseClick,l, %px%, %py%,,,D
    gosub,ITEM
}

if errorlevel = 1
{
    MouseMove, 782,321
    sleep, 100
    MouseClick,l
    gosub,ok1
}
}
return

        
    ITEM:
    
    {
        ImageSearch, px,py, 77,39,590,234, *15 t1.png
        if (errorlevel = 0)
        {
        MouseMove, %px%, %py%
        sleep,30
        MouseClick,l, %px%, %py%
        gosub,ok1
    }
if (Errorlevel =1)
    {
        ImageSearch,px,py, 27,38,763,497, *15 S.png
        MouseMove, %px%, %py%
        sleep,50
        MouseClick,l, %px%, %py%
        gosub,ok1
    }
}
return


ok1:

{
    ImageSearch, px,py, 453,100,518,140, *10 ok1.png
    if (errorlevel = 0)
    {
        MouseClick,l, px+8,py+10
    }
}
return

return

end::
ExitApp

 

    • 글자 크기
댓글 11
  • 2020.3.13 15:45 댓글

    우선 "코드 스니펫" 플러그인을 이용해서 코드를 써주시면 가독성이 좋습니다.. ^^

     

    코드는 거짓말을 하지 않습니다. 코딩한대로 진행해요. 이건 '프로그래밍 언어'가 지켜야 할 기본적인 사항입니다. 오토핫키도 그렇고요. 즉, 어쩔때 잘 되는 코드는 그냥 잘 되는 코드인데, 무언가 빈 틈이 있다는 것이겠죠. (오류가 있는 코드는 아니란 뜻입니다.)

     

    1. gosub을 쓰지 마시고요.

    2. ImageSearch는 부하가 있는 작업입니다. 적당한 양의 Sleep을 줘보시고, 가능하면 ImageSearch를 사용하지 말아주세요. (대체할수있는 다른 방법을 찾는게 나을 것 같습니다.)

    3. 예외처리가 제대로 되어있지 않습니다. ImageSearch에서 결과로 나타날 수 있는 ErrorLevel은 3가지입니다. 0, 1, 2입니다. 0은 이미지를 찾았을때, 1은 못찾았을 때이며 2는 정상적으로 진행하지 못했을때입니다. 본문 스크립트에선 ErrorLevel이 2일때의 예외처리가 하나도 되어있지 않습니다. gosub구문이 0혹은 1일때만 있기 때문입니다. 또한, 같은 조건 검사를 여러번 하는 경우를 방지하기 위해 if ~ else if ~ else 문을 써주세요. (현재는 if만 사용하셨습니다.)

  • 2020.3.13 15:47 댓글

    그리고 J1~J5 이미지가 없으면 마우스 이동 782,321 좌표로 이동하여 클릭이 됬다 안됬다 할떄도

    → 이렇게 쓰신 부분은 당연한겁니다. 본인 코드를 보시면.. J5 이미지에 대한 결과만 가지고 MouseMove 및 gosub을 수행합니다.

  • 프날님께
    냅냅스글쓴이
    2020.3.13 15:59 댓글

    답변 감사합니다.

    코드 스니펫은 지금 보고 알았습니다 다음에는 꼭 적용해서 작성 하겠습니다.

     

    오토핫키 입문단계라서 답변 주신게 이해가 되는것도 있고 이해가 안되는것도 있습니다.

    1. gosub을 및 이미지서치를 안쓰면 스크립이 너무 길어질고 복잡 할거 같기도하고 초보라서 이게 한계라 이렇게 했습니다 ㅠ

    2. 이게 쭉 켜놓는게 아니라 잠깐만 사용 (1분) 정도 사용하려고 합니다.

    3. 여기가 조금 이해가 잘 안가서 혹시 스크립 좀 수정해서 써주실수 있을까요?

     

  • 냅냅스님께
    2020.3.13 16:11 댓글

    2. 부하는 시간도 시간이지만, 여기서 말하는 것은 순간적으로 동작이 원하는대로 되지 않을 수 있다는 뜻입니다.

     

    3. 현재 ErrorLevel이 0일때와, 1일때만을 조건 검사하여서 각각에 맞는 동작을 수행시는데, 0도 1도 아닐 때 (= 2일때)를 넣어서 예외처리를 해보시라는 말입니다. 예외처리 구문은 본인 마음에 드시는 방법으로 하면 됩니다. 메시지박스를 넣든, 툴팁을 넣든, 프로그램을 종료시키든...

  • 프날님께
    냅냅스글쓴이
    2020.3.13 23:05 댓글

    if errorlevel = 1

    {

    MouseMove, 782,321

    sleep, 100

    MouseClick,l

    gosub,ok1

    }

     

    if errorlevel = 2

    {

    MsgBox, 종료

    }

    }

    return

     

    위와같이 추가하였는데

    이미지 j1~j5 가 없으면 메세지 박스가 떠야되는데

    안뜨던데 뭐가 문제인가요???

     

  • 냅냅스님께
    2020.3.14 01:03 댓글

    이미지서치가 되는거죠 뭐..ㅎㅎ; 코드로 보이는 구문상의 오류는 안보이네요. 괄호 짝이 안맞다는 것 정도?

  • 2020.3.14 11:36 댓글

    goto와 gosub모두 코드가 길어질수록 코드가 꼬여서 내가 원하는 곳으로 goto하는게 논리적으로 보일수도 있지만 지양되는 방법입니다.

    하지만 저도 다른 매크로 프로그램에서 goto로 입문했어서 편리함을 어느정도는 인정하면서 조언을 드리면,

    return에 대해서 아직 헷갈리는 부분이 있으시면 gosub보다는 goto로만 코드를 작성하시는게 직관적으로 이해가 쉬우실 것 같습니다.

    또한 지금 작성하신 짧은 코드에서 goto를 사용하는 의미는 나는 Loop, While등의 반복문을 대신해서 goto를 쓰겠다라고 생각하시면 역시 직관적이실 겁니다.

    즉, 코드를 한 번 수정하시면서

     

    라벨1:

    내용

    goto, 라벨2

     

    라벨2:

    내용

    goto, 라벨1

     

    이런식일 경우 Loop없이 반복이 된다고 생각하시면 됩니다.

  • 2020.3.14 12:25 댓글
    CoordMode, Pixel, Screen
    CoordMode, Mouse, Screen
    
    Home::
    
    ImageCheck:
    ImageSearch, x1, y1, 638, 81, 767, 418, *15 j1.png
    if (ErrorLevel = 0)
        goto, ITEM
    ImageSearch, x1, y1, 638, 81, 767, 418, *15 j2.png
    if (ErrorLevel = 0)
        goto, ITEM
    ImageSearch, x1, y1, 638, 81, 767, 418, *15 j3.png
    if (ErrorLevel = 0)
        goto, ITEM
    ImageSearch, x1, y1, 638, 81, 767, 418, *15 j4.png
    if (ErrorLevel = 0)
        goto, ITEM
    ImageSearch, x1, y1, 638, 81, 767, 418, *15 j5.png
    if (ErrorLevel = 0)
        goto, ITEM
    MouseClick, Left, 782, 321 ;이 부분이 좀 아리까리한데 위의 j1~j5를 모두 찾지 못한 경우, 782,321 좌표로 이동하고 
    	goto, ok1 ;클릭인거면 제가 작성한대로 바로 마지막줄에 클릭으로 넣으면 됩니다.
    
    
    
    ITEM:
    ImageSearch, x2, y2, 77, 39, 590, 234, *15 t1.png
    if (ErrorLevel = 0)
    {
    	MouseClickDrag, Left, x1, y1, x2, y2
    	goto, ok1
    }	
    ImageSearch, x2, y2, 27, 38, 763, 497, *15 S.png
    if (ErrorLevel = 0)
    {
    	MouseClickDrag, Left, x1, y1, x2, y2
    	goto, ok1
    }
    goto, 위에 두 이미지 모두 없을 때, 보낼 라벨, goto, ITEM도 가능
    ;이 부분 밑에 if (Errorlevel =1) 아래부분에 ImageSearch,px,py, 27,38,763,497, *15 S.png 이후에 ErrorLevel에 대한 내용이 없습니다.
    ;우선 임의대로 고쳤습니다.
    
    
    ok1:
    ImageSearch, px, py, 453, 100, 518, 140, *10 ok1.png
    if (ErrorLevel = 0)
    {
    	MouseClick, Left, px+8, py+10
    	goto, ImageCheck
    }
    goto, 위의 이미지가 없을 때, 보낼 라벨, goto, ok1도 가능
    
    
    End::
    ExitApp

     

    MouseClickDrag, Left, x1, y1, x2, y2 라는 MouseClick, D/U옵션 및 MouseMove 대신 쓰기에 좋아보이고,

    제가 작성한 부분이 원하는 기능과는 많이 다르셔도 어느정도 참고가 됐으면 좋겠네요.

     

    goto의 장점은 짧은 코드에서 Loop없이 원하는 대로 바로바로 코드를 보낼 수 있기 때문에, return을 프로그램 종료를 위할 때 딱 한번만 써주시면 됩니다.

    근데 여기서는 무한히 돌아가는 와중에 End 핫키로 매크로를 종료하기 때문에 그마저도 필요 없어서 생각을 단순하게 해도 매크로가 동작한다는

    장점이 있습니다. 참고로 Reload라는 매크로를 재시작해주는 기능의 핫키도 추가하면 좀 더 편리하게 사용가능합니다.

     

    또한 함수 대신의 느낌으로 라벨을 사용하기 때문에 변수를 모두 전역변수처럼 고민없이 쓸 수도 있습니다. 처음에 맛보기로 지금처럼 사용하시면서,

    이후에 프날님 강좌로 하나씩 배우시면서 Gui, 함수, 변수, return, Loop등을 배우시면서 코드를 정갈하게 만들어가시는 재미도 느끼실 수 있을거라고 생각합니다.

     

    만약 ImageCheck부분을 반복하고 싶으신거면 MouseClick부분 대신 goto, ImageCheck 하시면 Loop와 같습니다.

  • 2020.3.14 12:53 댓글

    아직 익숙하지 않은 부분이 많겠지만 코드를 작성하실때, 중괄호의 위치나 대소문자의 구분, 혹은 콤마(,)사용 이후의 띄어쓰기 등에서 일관성을 유지하면서 코드를 작성하시면, 스스로 눈으로 디버깅하실 때 굉장히 편하다고 느낄 가능성이 높습니다.

     

    오토핫키가 대소문자 구분도 없고, 한글변수도 가능하며, 왠만하면 일단 작동이 되기 때문에, 오류를 찾을 때 Msgbox, 등을 이용해서 찾는게 습관화 되시면 좋습니다. 예를 들어 이미지를 찾아서 이 구간이 수행되는지 알고 싶으면 그 부분에 Msgbox, 찾음을 넣고 체크한다는 식으로 사용가능합니다.(이후에 제거)

     

    오류체크는 눈으로 할때도, 라인 바이 라인이 기본이기에 일관성을 더욱 강조드리고 싶습니다.

    또한 컨트롤 + Space의 기능을 잘 활용하시면, 코드작성에 있어서 2배 이상의 편리함을 느끼실거라고 생각하고 추천드립니다.

    ex) errorlevel을 치고 싶을 경우 error정도까지 쓴 후, 컨트롤 + Space를 누르면 error로 시작하는 단어를 선택할 수 있고, ErrorLevel로 일관성있게 사용이 가능합니다.

  • 차랑님께
    2020.3.14 14:16 댓글

    저는 goto에 대해 굉장히 회의적인 시각을 가지고있었는데, 차랑님 말씀을 보니 오히려 간단하게 매크로 한번 만들고 관두실 분이면 goto를 써도 괜찮겠네요.

    goto라는게 마성의 매력이 있나봅니다. 이걸 한번 쓴 분들은 좀처럼 끊기 쉽지 않아하시고, 그래서 강좌에서 제가 goto(혹은 gosub)을 "처음부터" 사용하지 말아주심을 당부드렸던 것입니다.

    그런데, 컴퓨팅 사고가 부족하신 분들께는 '도저히 goto없이는 못 짜는 구조네'라고 생각하실 여지가 있다고도 생각됩니다. 저는 이럴 때 그래도 goto를 쓰지 말라고 말씀드리지만, 차랑님처럼 goto를 사용하는 방법을 알려드려도 됐겠네요.

     

    사실 이거는 최근 느끼는 것인데요, 제가 다른분들께 goto gosub 쓰지 말자고 아무리 말씀드려도, 다들 그냥 쓰시더라고요. 제가 너무 예민한 것 같기도 합니다. 언젠가 차랑님처럼 정갈한 코드의 장점을 알게 되는 날이 와야 그분들은 그제야 goto를 안 쓰시려고 하는 것 같습니다. 많은 분들이 좋은 코딩 스타일에 대해 알으셔야할텐데말이죠.

  • 프날님께
    2020.3.14 14:38 댓글

    저도 질문하기 전까지 코드에 goto가 한 번 쓰면서 이건 쓸 수 밖에 없는 구조네 라고 생각했다가 계속 논리적으로 코드를 간단하게 하려다보니 오히려 개인적으로 생각하고 있던 2~3개의 문제들이 같이 해결되면서 goto도 없앨 수 있었네요.

     

    직관적이라고 말하는게 맞을지 모르겠지만 기능들이 도형화 되있고, 드래그 앤 드롭방식으로 순서를 조합하는 매크로에서 보통 기능들 자체에 if기능과 goto기능이 묶여 있어서 그 기능에 익숙해져 있으면 자연스럽게 goto를 쓰게 되는 경향이 있는 거 같아요.ㅎㅎ

댓글 달기

서버에 요청 중입니다. 잠시만 기다려 주십시오...