게임에 보면 ,?아이템 얼마 , 합계얼마 , 능력치 얼마 ,, 이런식의 숫자가 있습니다.
이걸 가져와서 써먹어야 할때가 있죠.
?
이 부분을 해보신분이 계시나요?
어떤식으로 처리 하셨는지 궁금합니다.
?
?
제가 클래시오브클랜에서 자원 검색시 , 자원이 얼마인지 알아내서 그자원이상일경우 멈추는걸 해봣는데요.
해보면 너무 복잡하게 나열이 되네요. 제 생각이 짧아서 응용이 안되는군요.
?
클래시오브클랜 서칭시 아래처럼 숫자가 나옵니다.
저 숫자들의 문제점은 한자리에 고정되지 않습니다. 상하는 1픽셀차이로 왓다갔다하니 상관없는데
좌우가 차이가 많이 납니다.
그림보시면 , 숫자 1이 폭이 좁고 , 0과 4가 폭이 꽤큽니다. 나머지숫자는 비슷하죠.
또한 중간에 공백이 폭이좁게 있습니다. 이 공백역시 첫자리 다음에 있을수도 , 2번째자리 다음에 있을수도 잇고 그럽니다.
이걸 이미지 서칭으로 해보려고 고심한끝에 , 아래같은 방법밖에 안떠오르더군요.
?
각 자릿수를 범위로 잡는데, 잴 먼저 첫자리수부터 잡습니다.
여기서 첫자리가 1이면 다음자리부터 범위가 앞으로 당겨지게 됩니다.
4라면 더 뒤로밀리겠죠.
그래서 첫자리가 1인지 4인지 구분부터 합니다.?
범위를 먼저 숫자 1의 폭만큼 이미지서칭해서 1이면 다음 자리는 숫자1 바로 다음 좌표부터 우측으로 시작됩니다.
그런데, 1다음에 공백이 잇을수도 있기 때문에 공백을 찾아야합니다.
공백(스페이스)은 이미지서칭이 불가능하기 때문에 , 그림 숫자 8에 표시된것처럼 1번범위서칭해서 1인지 판단,
1이면 1이고 , 1이 아니면 2번범위까지 확대해서 1이나오나 판단하여 1이 나온다면 공백있고 뒷자리가 1이라는 거죠.
이 부분 좀 생각해보시면 이해되실거에요.
저런식으로 각자릿수에 1인지 , 아닌지 공백인지 , 0인지 4인지 각자릿수마다 다 경우를 따지면서
1,0,4 아닐경우 숫자 숫자 0~9까지 서칭해서 맞는게 그자리 숫자라고 찾게 됩니다.
일단 대충 2번짜리 찾는거 부분적으로 보면요.
;2번째 자리가 1인지??
if(ImgcheckPS(54,61,60,76,"no1"))
{
2nb:=1 ?; 2번째자리 1
if(ImgcheckPS(59,61,66,76,"no1"))
{
;2번째자리 1,바로다음 1인지 1이면 3번째1
3nb:=1
return
}else{ ?; 2번째자리 1아닐경우 x좌표범위 확장
if(ImgcheckPS(59,61,70,76,"no1")) ? ;확장자리에 1이면
{
3nb=space ?; 3번째는 공백
return
}else{ ?;확장자리 1아니면
loop,parse,nums,| ? ; 0~9까지 루프서칭
{
LF := "no"A_LoopField
if(ImgcheckPS(59,61,70,76,LF)) ?;숫자찾으면
{
3nb:=A_LoopField ?;3번째자리는 루프숫자
return
}
if(a_loopfield=0){
3nb=space
return
}
}
}
}
}else{ ? ;두번째자리 1아니면,,,,,아래..
if(ImgcheckPS(53,61,65,76,"no1"))
{
생략................
대충 저런 구조가 되어버리는데요.
if조건문으로 저렇게 계속 범위 쪼개가면서 처리할수밖에 없을까요?
지금 저기 자릿수는 3자릿수 범위까지하는데 이게 커질수록 점점 처리속도는 심하게 느려집니다.
그래서 편법으로 공백이 나오면 바로 넘어가게 하고잇네요. 1자리 검색후 2자리가 공백이면 다음거 검색으로요
어차피 10만단위 이상만 찾을거라,
위 구조로 작동은 아주 잘됩니다.. 10만이상 단위로 실수없이 잘 찾네요.
근데 ?속도도 좀 느리고 다른방법이 없을가 하고 찾아봤는데요
스캔해서 문자로 바꿔주는 OCR 어플이 있더군요.
GOCR이라는건데 ?, 오토핫키에 쓸수잇게 되어있네요. ?include로요.
근데 정확성이 매우떨어져요 특히 게임상 문자는 불가능에 가깝더라구요.?
혹시 이런 게임상 숫자를 좀 쉽게 잡아낼수 있는 방법이 있을까요.
그리구 위 제가 쓴 거 좀더 보기 좋게 깔끔하게 할수 잇는 방법은 어떻게 해야 될까요.
그나마 저거 하면서 함수 응용하다가 그럭저럭 초반 응용법은 잡혀가네요.
문자인식은 항상 까다롭죠.
우후훅님의 코드를?보면 이런 식으로 이용하면 되지 않을까 싶네여;;
; iImage:?[0~9: 숫자][10: 공백]
iResult:= 0
Loop
{
? bExist:= false
? iImage:= 0
? Loop, 11
? {
??? sName:= no . %iImage%
; ImgcheckPS 검색 위치(?)를?변수로 이동.
??? if ImgcheckPS(59,61,66,76,%sName%)
??? {
????? bExist:= true
??? ? Break
??? }
? ? iImage+= 1
? }
? if !bExist
??? Break
? else
? {
??? if iImage = 11
????? Continue
??? else
? ??? iResult*= 10
? }
? iResult+= iImage
}
테스트는 안해봤습니다.
참고만 하시길..