안녕하세요~ 바람처럼 입니다~^^
지난 강좌에 이어서 오늘도 프렙 3.7의 응용편 강좌를 계속해 보도록 하겠습니다..
이번 강좌에서 다룰 내용은, ?영역과 이미지를 다루는 방법들입니다~
자 그럼 프렙의 환상적인 세계로 같이 여행을 떠나 보시죠~^^
1. 좌표의 구성
기본적으로 프렙에서 모든 좌표와 이미지는 영역형 입니다.
지난번 변수 기초편에서 영역형 값을 이루고 있는 몇가지 요소들을 살펴 봤었죠?
기억을 상기시키는 의미에서 그때 설명드렸던 그림을 다시 보시겠습니다.
영역형 변수 var 가 있다고 할때, 각 좌표의 구성요소는 이와 같습니다.
예를들어, var = rect:(10 20 30 40) 으로 정의된 변수가 있다고 할때, var.x / var.y 값은 어떻게 될까요?
var.x = (var.left + var.right) / 2 = (10 + 30) / 2 = 20
var.y =?(var.top + var.bottom) / 2 =?(20 + 40) / 2 = 30
이렇게 됩니다. 이 (x, y) 좌표값은 터치에서 사용되므로 위의 각 좌표간 관계를 잘 기억해 두셔야 합니다.
터치에서 좌표를 직접 지정하지 않고 변수를 이용하면 경우에 따라 위치를 변경할 수 있어서 편리합니다.
그럼 어떤식으로 변수를 이용할 수 있는지 살펴보도록 하겠습니다.
우리가 터치하고자 하는 좌표값이 (11,22) 라고 가정했을 때 다음과 같이 변수를 지정합니다.
변수 형식은 영역형으로, 좌표값은 x y 를 같은 값으로 지정해 주면 됩니다.
그런후 실제 터치하는 부분에서는 좌표값 부분에 pos 을 지정해 주면 됩니다.
이렇게 하면, 실제 터치좌표 부분에는 pos.x, pos.y 값이 들어가게 되므로 마음껏 위치를 바꿀 수 있게됩니다.
여담으로, 터치시간을 지정하는 부분에도 변수를 사용할 수 있습니다.
이런식으로 시간입력 부분에 변수를 입력하게 되면, 그 변수가 지정되어 있으면 변수값으로
변수가 지정되지 않았으면 옆에 명시된 디폴트 값으로 시간이 지정됩니다.
터치뿐만 아니라 시간을 입력받는 모든 시퀀스, 즉 웨이트나 이미지검색 등에서도 마찬가지로 변수를 사용할 수 있습니다.
경우에 따라 대기하는 시간을 변경해야 하는 경우 변수를 사용하면 쉽게 해결할 수 있습니다.
게임에서 매크로를 만들다 보면, 빈번하게 처리해야 하는 부분이 맵입장 입니다.
몬길의 예를 들자면, 성장의대륙 맵이 다음과 같을때?지정한 맵에 입장하기 위해서 각 맵의 위치를 일일이 터치하도록 만들어야 합니다.
그러나 이런 부분을 변수로 만들면 아주 간단하게 처리할 수 있습니다.
map10=rect:(104 586 104 586)
map11=rect:(320 560 320 560)
map12=rect:(194 400 194 400)
이런식으로 정의한 다음, 사용자가 지정한 맵번호를 변수에 넣어 터치해 주기만 하면 되겠죠.
그러나 이것보다 더 간단한 방법이 있습니다. 바로 지난 응용편 #1 에서 설명드린 설정파일을 이용하는 방법입니다.
설정파일에 각 맵의 좌표를 다음과 같이 모두 지정해 놓습니다.
영웅10=104,586
영웅11=320,560
영웅12=194,400
그런다음 사용자가 지정한 맵을 조합합니다. 다음에서 AdvMap 에는 "영웅", AdvMapNo 에는 "10" 값이 있다고 할때
이 시퀀스를 통해 map 에는 "영웅10=" 란 값이 조합되게 됩니다.
이 map 값을 응용편 #1 에서 설명드린 설정파일 읽기 프로시져를 부르게 되면 "104,586" 이란 값을 읽어오게 됩니다.
이렇게 읽은 값을 pos 에 넣고 다음과 같은 시퀀스를 부르게 되면
x="104", y="586" 으로 세팅됩니다. 이?x, y 좌표값을 역시 응용편 #1 에서 설명드린 문자를 숫자로 바꾸는 A2I 프로시져를 통하면
최종 x, y 좌표값에 pos=:rect(104 586 104 586) 값이 세팅됩니다. 이 변수를 이용해 그대로 터치해 주면 되겠죠.
이런식으로 복잡한 맵이동을 설정파일과 간단한 시퀀스를 통해 쉽게 처리할 수 있습니다.
이 방법은, 맵이 추가/삭제 되거나 변경되더라도 매크로를 수정할 필요없이 설정파일에 좌표값만 바꿔주면 되므로
유지관리나 사용자 편의를 위한 좋은 방법이 될 수 있습니다.
2. 영역 및 이미지 처리
위에서 살펴본 바와 같이 프렙에서 좌표값은 쉽게 변수로 처리할 수 있어 응용의 범위가 넓습니다.
그러나 영역형 변수의 이용은 궁극적으로 이미지와 결합될 때 그 진가를 발휘하게 됩니다.
순서가 살짝 뒤바뀐듯 하지만, 영역형 변수의 값을 지정하는 방법을 살펴 보겠습니다.
영역형 변수는 앞서의 예처럼 좌표값을 직접 입력할 수 도 있지만, 그림처럼 편집기능을 통해 화면에서 선택할 수도 있습니다.
여기서 전체화면을 선택하면, 영역값이 현재 해상도의 최대값으로 지정됩니다.
그림처럼 480x800 해상도인 경우 각 x,y 값들이 거기에 맞게 설정된걸 보실수 있죠.
일부 영역만 지정할 경우, 이미지검색 설정을 하듯 파일을 불러 영역을 지정할 수도 있습니다.
이렇게 설정한 영역은 다양한 용도로 사용할 수 있습니다.
먼저 이번 프렙 3.7에 새로 생긴 이미지검색 구역설정에 이용하는 방법을 살펴보겠습니다.
이번 버전부터는 Search Similarity 옵션에 구역설정이 추가되었습니다.
이전까지 이 옵션은 전체화면에서 검색을 했으나, 이제부터는 특정 영역만 검색할 수 있습니다.
Area 를 클릭하면, 영역변수 지정과 비슷한 인터페이스가 뜹니다. 여기서 전체화면 혹은 임의영역 선택을 할 수도 있지만
우리가 미리 지정해둔 변수를 이용할 수 도 있습니다.
변수의 이용은, 두말할 필요없이 검색해야 하는 영역이 가변일 때 유용하게 사용할 수 있습니다.
예를 들자면, 화면에 같은 이미지가 여러개 있을 때 특정 부분만 검색하는 경우를 들 수 있습니다.
위의 그림과 같이, 대전시작 칼모양 이미지가 화면의 3군데 위치하고 있습니다.
이를 구분하는 방법으로, 이미지검색시 Color Similarity 를 사용할 수도 있겠지만
검색영역을 특정영역으로 지정하여 Search Similarity 를 이용할 수도 있습니다.
또한, 이미지검색시 영역지정은 좀더 빠른 이미지검색에 도움이 되기도 합니다.
그러나 만약 위의 예처럼 검색해야 하는 이미지가 특정좌표가 아닌 화면상 어디서 나올지 모른다면 어떻게 해야 할까요?
이를 판단하기 위한 방법으로 영역형 변수의 연산을 이용할 수 있습니다.
지난번 변수편에서 설명드린 @lastmatch 라는 영역형 환경변수가 있습니다.
이 변수는 이미지검색에 성공했을 경우, 해당하는 이미지 좌표값을 갖게 됩니다.
이와함께 영영형 변수의 연산중에 & (교집합), ]= (포함) 연산기호를 사용하면 쉽게 판별할 수 있습니다.
& 연산은, 주어진 두 영역의 교차점이 있을 때 참이되는 연산자이며
]= 연산은, 두번째 영역이 첫번째 영역에 완전히 포함될 때 참이되는 연산자 입니다.
이미지검색에 성공후, 해당 이미지가 미리 지정된 pos 영역에서 찾았는지를 판별하려면 다음과 같이 해주면 됩니다.
이 때, ]= 연산자 대신 & 연산자를 쓰게되면 완전히 포함하지 않고 일부만 겹치더라도 참이 됩니다.
경우에 따라 적절히 구분해서 사용하시면 되겠습니다.
이밖에도 | (합집합) 연산자도 있습니다. 이 연산자는 주어진 영역을 완전히 포함하는 새로운 영역값을 리턴합니다.
즉, (10 10 20 20) 영역과 (100 100 200 200) 2개의 영역이 있다고 할때 | 연산을 사용하게 되면
결과값은 (10 10 200 200) 의 영역값이 됩니다. 두 영역을 모두 포함하는 커다란 영역이 되는거죠...
이 연산은 찾은 이미지의 영역을 확장해서 다시한번 검색하는 경우 많이 사용됩니다.
그림과 같이 장비판매를 하는 경우를 예로 들어 보겠습니다.
팔려고 하는 장비를 이미지검색으로 찾은 후, 해당 장비에 해당하는 판매버튼을 터치 하고자 하려면 어떻게 해야 할까요?
해당 이미지검색에 성공했으면 영역을 판매 버튼이 있는 곳까지 확장시켜 줍니다.
그 후에, 확장된 영역인 pos 안에서 다시 판매버튼을 검색해 터치해 주면 쉽게 구현할 수 있습니다.
혹은, + 연산자를 이용하여 영역의 y 좌표값만 (x 좌표 아닙니다!!!) 확장할 수도 있습니다.
위의 2가지 경우는 모두 영역 연산자의 응용을 보여드리기 위한 목적으로 구현되었으며
실제로 위의 예와같은 경우, 지난번 강좌에서 설명드렸던 터치의 Use last point 옵션을 사용하면
조금더 간편하게 구현할 수 있습니다~^^
지금까지 프렙 3.7에서 추가된 강력한 기능들을 살펴 보았습니다. 어떠셨는지요?
나름 다양한 예를들어 쉽게 설명하려고 노력했지만, 생각만큼 쉽지는 않았던 것 같습니다...^^;;
응용편 강좌 초반에도 말씀드렸지만, 새로 추가된 기능들이 모두 코딩기법에 관련된 것들이니 만큼
아무래도 실제 시퀀스 사용보다는 알고리즘 설명이 주가 된듯한 느낌이 듭니다~
이번에 추가된 기능들은 프로그래밍 공부를 하셨던 분들이라면 제 설명없이도 잘 사용하실수 있을것이고
이쪽을 잘 모르시는 분들께는 아무래도 이해하기가 쉽지는 않을것이란 생각이 듭니다...
아무쪼록 이 강좌가 프렙을 이용한 많은 훌륭한 매크로의 기반이 되었으면 하는 바램입니다...
지금까지 따라오시는 정말 수고 많으셧습니다~ 저는 다음번 더 좋은 강좌로 찾아뵙겠습니다~
감사합니다~^_^
너무 어렵네요 ㅠㅠㅠㅠㅠ