위 스샷과 같은 리듬게임 매크로를 만드려고 합니다.
1. 구동환경
MEmu라는 에뮬(?)을 통해 PC에서 안드로이드 게임을 구동
i7의 부족함이 없는 컴퓨터 성능
2. 게임에 대한 소개
리듬게임으로 캐릭터 면상 위에 빨간버튼이 오면 클릭, 주황 버튼이 오면 꾸욱 누르기,
파란 버트닝 오면 해당 방향으로 드래그 해야 한다.
3. 설계
이미지서치와 비활성 클릭을 통한 구현
4. 문제점
- 멀티터치가 안됨. 동시에 꾸욱 눌러야 하는 상황에 대처 불가능
- 프로그램 성능 부족. 초기 테스트 단계에서 몇가지 버튼만 테스트할 시에는 작동을 잘 하나,
버튼수가 많아지고 이미지서치하는게 많아지니 제대로 구동이 안됨.
5. 소스
global bt1:=252|632<<16
global bt1l:=162|632<<16
global bt1r:=342|632<<16 ;버튼 위치들에 대한 값. bt1l, bt1r은 드래그해야할 도착 위치.
global wintitle:="MEmu 2.9.6 - MEmu"
global n1:=0
F8::exitapp
F2::
{
loop ;무한반복
{
imagesearch,vx,vy,237,630,267,660,*10 %A_ScriptDir%/normal.bmp ;일반 클릭하는 명령
if errorlevel = 0
{
postmessage, 0x201, 1, %bt1%, , %wintitle%
postmessage, 0x202, 0, %bt1%, , %wintitle%
}
imagesearch,vx,vy,237,630,267,660,*10 %A_ScriptDir%/push.bmp ;꾸욱 눌러줘야 하는것에 대한 명령
if errorlevel = 0
{
if n1 = 0
{
n1:=n1+1
postmessage, 0x201, 1, %bt1%, , %wintitle%
}
else
{
n1:=n1-1
postmessage, 0x202, 0, %bt1%, , %wintitle%
}
}
imagesearch,vx,vy,187,622,207,642,*10 %A_ScriptDir%/side.bmp ;왼쪽으로 드래그
if errorlevel = 0
{
if n1 = 1
{
n1:=13-1
postmessage, 0x202, 0, %bt1%, , %wintitle%
}
else
{
postmessage, 0x201, 1, %bt1%, , %wintitle%
postmessage, 0x202, 0, %bt1l%, , %wintitle%
}
}
imagesearch,vx,vy,297,622,317,642,*10 %A_ScriptDir%/side.bmp ;오른쪽으로 드래그
if errorlevel = 0
{
if n1 = 1
{
n1:=n1-1
postmessage, 0x202, 0, %bt1%, , %wintitle%
}
else
{
postmessage, 0x201, 1, %bt1%, , %wintitle%
postmessage, 0x202, 0, %bt1r%, , %wintitle%
}
}
나머지 4개의 버튼에 대하여 위 소스 반복.
6. 상세
버튼의 색상이 단일 색상이 아니라서
딱 1개 픽셀만 찍어내서 이미지 서치로 약간의 오차범위를 스캔하게 했습니다.
컴퓨팅 성능낭비를 줄이기 위해 버튼별로 20X20 ~ 30X30 픽셀 범위로 스캔하도록 했어요.
드래그 해야하는 파란색 버튼의 경우, 빨강 주황버튼과 달리 방향구분이 필요해서
해당 방향으로 삐죽 튀어나온 부분의 좁은 구역에 파란색 픽셀을 감지하도록 했구요.
우선 빨강 버튼과 주황버튼만 조합한 테스트 단계에서는 정상작동 잘 되는걸 확인했구요
파란색 버튼까지 스캔하는 코드를 넣으면 작동을 못합니다.
파란색 버튼 설계가 잘못되서 드래그를 못하는건 그렇다고 쳐도
정상 작동되던 빨강, 주황버튼까지 작동을 못하더라구요.
아무래도 이미지스캔할게 많아지다보니 제때제때 동작을 못하는거 같습니다.
원하는건
- 멀티터치를 어떻게 구현해야하나
- 쾌적한 동작을 위해 어떻게 해야하나
입니다.
코드의 개선점이라던가, 좋은 함수의 소개든지 어떤것이든 좋습니다.
1. 동시클릭은 안됩니다. 아주 빨리 순차클릭으로 동시처럼? 작동하게는 가능합니다.
2. imagesearch <- 이건 에어로피크가 켜져있으면 느립니다. 윈 7의 경우 에어로 피크를 완정히 끌 수 있어서 빨리 작동하지만 원10일 경우 기본적인 서치시간이 있어서 1을 구현하기가 힘듭니다.
정말 빠른 캡쳐 방법이 있지만, 지금은 지원하는 지는 모르겠지나 미뮤는 다이랙트액스를 지원하지 않아 프린트윈도우 함수를 못씁니다(녹스 스피드모드, 블루스택 가능).