안녕하세요, 아래 글에 조언 주신분들 감사합니다.
현재 작업중인 매크로는 '모두의삼국지FREE'라는 앱게임입니다.
그런데 똑같은 '이미지'가 각 스테이지에서 계속나옵니다. 반복되는 '이미지' 하나만 따서 스테이지1에는 '*오차율' 를 줬을때 찾고, 2에서는 '*오차율' 을 찾는 테스트를 노트에 적어가면서 65%라는 적성선을 찾아냈습니다.
근데 또..ㅠ
예를들어 "모든 스테이지에서 이미지1.bmp를 찾으면 클릭해라."
근데 게임시스템 자체적으로 이미지1.bmp가 있는 맵을 임의로 움직이면 이미지1.bmp이 있는데도 불구하고(게임내 UI가 이미지를 가리지도 않음) 인식을 못합니다.
어째됐던 위 문제점은 제가 풀어가야할 숙제고요.
아래 질문글에 올렸던 '소스파일'에서 TellingTrade 기능만 따로 빼서 테스트해봤는데요.
수정 전 소스에서 쓰레드가 쌓인다고 하셔서 break를 줬는데도 똑같은 증상을 보입니다.
혹시 소스가 잘 못 된건가요?
1. 오류창
2. 소스
수정전 TellingTrade: { WinSet, AlwaysOnTop, On, BlueStacks App Player WishClick2() } return WishClick2() ; 무역호통 간언 제출 함수 { Loop, 3 { if(이미지함수(clickX, clickY, "이미지1.bmp", 165, 80, 256, 330)) if(errorlevel=0) { clickX:= clickX + 256 clickY:= clickY + 34 Click(clickX, clickY) ; ClickSecond는 동작 후 sleep없음 } sleep, 300 ; 중략 if(이미지함수(clickX, clickY, "이미지5.bmp", 165, 80, 256, 330)) { clickX:= clickX + 256 clickY:= clickY + 34 Click(clickX, clickY) } sleep, 300 } ; 3회 검색이 끝나고 SelectRefresh2() ; 새로고침 } return SelectRefresh2() ; 간언제출시 새로고침 함수 { Click(430, 75) gosub, TellingTrade } return |
수정후 WishClick2() ; 이미지1.bmp ~ 이미지5.bmp 를 찾고 새로고침클릭하고 현재 Loop는 동작중인 빠져나와라. { ; 생략 Loop { if(이미지함수(clickX, clickY, "이미지1.bmp", 165, 80, 256, 330)) { clickX:= clickX + 256 clickY:= clickY + 34 Click(clickX, clickY) } sleep, 300 ; 중략 if(이미지함수(clickX, clickY, "이미지5.bmp", 165, 80, 256, 330)) { clickX:= clickX + 256 clickY:= clickY + 34 Click(clickX, clickY) } sleep, 300
SelectRefresh2() ; 새로고침 break ; 쓰레드가 계속 쌓이는 걸 깨고자 break를 줬습니다. } } return
SelectRefresh2() ; 간언제출시 새로고침 함수 { Click(430, 75) ; 새로고침 클릭 sleep, 1000 WishClick2() } return |
3. 해결소스
TellingTrade: ; 무역호통제출버튼 { Loop { WishClick2() if(IsWish1Square(clickX, clickY, "Image\WishList\GoldOut.bmp", 253, 169, 318, 207)) { break } } } return ;------------------------------------------- ; Function 함수선언 WishClick2() ; 무역호통 간언 제출 함수 { if(!IsImageSquare(clickX, clickY, "Image\WishList\PopUp.bmp", 348, 111, 430, 305)) ; 자주빛 간언 skip 팝업창이 뜨면 { Click2(350, 270) ; 확인 클릭 (닫기버튼 250, 270) sleep, 2000 }
if(이미지함수(clickX, clickY, "이미지1.bmp", 165, 80, 256, 330)) { clickX:= clickX + 256 clickY:= clickY + 34 Click2(clickX, clickY) ; Click2는 동작 후 sleep없음 } sleep, 250 ; 중략 if(이미지함수(clickX, clickY, "이미지5.bmp", 165, 80, 256, 330)) { clickX:= clickX + 256 clickY:= clickY + 34 Click2(clickX, clickY) ; Click2는 동작 후 sleep없음 } sleep, 250 Click2(430, 75) ; 새로고침 sleep, 1500
} return |
이게 구조가 말로 설명하긴 어렵겠지만 일단 설명해볼게요.
처음에 WishClick2() 를 호출하죠 WishClick2안에서 SelectRefresh2() 를 호출하고 SelectRefresh2에서 또 WishClick2()를 호출하면
WishClick2()->SelectRefresh2()->WishClick2()->SelectRefresh2()->WishClick2()->SelectRefresh2()->WishClick2()->SelectRefresh2() 이런식으로 탈출없이 계속 파고드는 구조가 되어버립니다.
return문이 존재하는 의미가 없어요.