Автокликер Clickermann :: Форум
Основной раздел => Общие вопросы => Topic started by: muryginds on November 17, 2015, 07:37:10 PM
-
Собственно код
$WM_LBUTTONDOWN = 0x0201 // Левая кнопка мыши зажата
$WM_LBUTTONUP = 0x0202 // Левая кнопка мыши отпущена
$MK_LBUTTON = 0x0001 // Левая кнопка мыши в нажатом состоянии
$WM_MOUSEMOVE = 0x0200 // Мышь передвинута
$x1 = 400 // Координата по оси X Начало
$y1 = 950 // Координата по оси Y
$x2 = 400 // Координата по оси X Конец
$y2 = 138 // Координата по оси Y
$wait_like = 0
WHILE($wait_like = 0)
GETSCREEN
IF_PICTURE_IN (400,75, 470,40, "level.bmp", -1, 95)
$wait_like = 1
MOVE($_return1+3, $_return2+3)
WAITMS(60)
LCLICK($_return1+3, $_return2+3)
MOVE($_xmax,$_ymax)
WAITMS(1000)
Else //прокрутить немного
postmessage($_HWND, $WM_LBUTTONDOWN, $MK_LBUTTON, $x1 + ($y1*65536))
waitms(60)
postmessage($_HWND, $WM_MOUSEMOVE, $MK_LBUTTON, $x2 + ($y2*65536))
waitms(60)
postmessage($_HWND, $WM_LBUTTONUP, $MK_LBUTTON, $x2 + ($y2*65536))
END_IF
END_CYC
Суть задачи - поиск по заданному диапазону нужной картинки, при совпадении нажать. Если не нашло - чуть-чуть промотать вниз.
Проблема - не находит искомую картинку level.bmp - постоянно в цикле. Скрипт работает в оконном режиме (привязан к окну) Есть подозрение, что в GETSCREEN попадает что-то не то, как проверить не знаю.
Скриншот экрана с приложением - https://yadi.sk/i/EauGIzYtkXKu4
-
Координаты области заданы не верно
IF_PICTURE_IN (400,75, 470,40, "level.bmp", -1, 95)
75 больше чем 40
Первые два числа это верхний левый угол области поиска, вторые две это нижний правый угол.
Чтобы посмотреть что видит кликер добавь после GETSCREEN функцию SCREENSHOT
-
Да, это я опечатался, вместо 40 должно быть 940. Но ситуацию это не спасает - немного изменил код и добавил в него GETSCREEN.
$wait_like = 0
WHILE($wait_like = 0)
GETSCREEN
SCREENSHOT
IF_PICTURE_IN (400,75, 470,940, "level.bmp")
$wait_like = 1
MOVE($_return1+3, $_return2+3)
WAITMS(60)
LCLICK($_return1+3, $_return2+3)
Else
postmessage($_HWND, $WM_LBUTTONDOWN, $MK_LBUTTON, $x1 + ($y1*65536))
waitms(60)
postmessage($_HWND, $WM_MOUSEMOVE, $MK_LBUTTON, $x2 + ($y2*65536))
waitms(60)
postmessage($_HWND, $WM_LBUTTONUP, $MK_LBUTTON, $x2 + ($y2*65536))
waitms(2000)
END_IF
END_CYC
Вот что получилось после первой итерации - https://yadi.sk/i/Z8A_G0MXkXSWQ
Вот что после второй - https://yadi.sk/i/CzFnCHJUkXSWW
По логике цикл должен закончится и картинка найтись на второй итерации, но он идет дальше - не пойму в чем причина
-
Какая тут логика если картинка меняется, сглаживание смазывает пикселы то вверх то вниз. Зачем писать 95% без цветокоррекции?
Скорректировал твою картинку под COLORMODE(6), проверил на твоем скриншоте теперь находит.
GETSCREEN
COLORMODE(6)
IF_PICTURE_IN (400,75, 470,940, "level_54.bmp", -1, 75)
-
Не совсем понял вопрос про логику, почему картинка меняется?
95 - это же точность поиска. Прочитал в справке - думал, может поможет найти
в любом случае спасибо большое за подсказку - вечером попробую!
-
Может и поможет... только без анализа, выставленное на обум - не всегда. Наверно 95 слишком высокий процент.
Но при сглаживании текста одним процентом ничего не добиться. Слишком много пикселов меняется (в процентном соотношении). А выставлять 50%...40%... приведёт к нахождению чего попало там где его нет. Рабочий промежуток примерно 70-100%
-
Может и поможет... только без анализа, выставленное на обум - не всегда. Наверно 95 слишком высокий процент.
Но при сглаживании текста одним процентом ничего не добиться. Слишком много пикселов меняется (в процентном соотношении). А выставлять 50%...40%... приведёт к нахождению чего попало там где его нет. Рабочий промежуток примерно 70-100%
Понятно, спасибо что доступно объяснили =)
а вы переделали картинку уровня после светокоррекции или просто рамки подрезали?
-
Картинка переделана, даже так видно. Особенно если смотреть на фон.
-
а вы переделали картинку уровня после светокоррекции или просто рамки подрезали?
Я сделал скриншот с твоего снимка level.bmp кликером с использованием цветокоррекции, потом обрезал все лишнее.
-
я примерно так это себе и представил
на 75% нашел 56 вместо 54
на 80% нашел 54 - 1 раз, при следующем запуске - прошел мимо. прямо чудиса =)
попробую с искомой картинкой поиграть
П.С. усе, заработало! спасибо. картинку перевырезал
-
Назрел вопрос вдогонку.
GETSCREEN
COLORMODE(6)
SCREENSHOT
SCREENSHOTEX(273,681, 360,709, "ho", 0)
Делаю скриншот приложения и его фрагмент. Фрагмент статичный. В первом случае текст есть - во втором - сами видите. Скрипт привязан к окну
Скрин - https://yadi.sk/i/Knd3vZ6rkZ8Nn
Фрагмент - https://yadi.sk/i/L5RxiL-bkZ8Mh - это часть кнопки, где размещено слово "домой"
-
Где здесь текст?
-
Вот это нежданчик. Работаю удаленно на другом компьютере через teamviewer, похоже, что зараза кликерманн как-то неправильно координаты мыши считывает. Спасибо!
А вот такой вопрос. В начале скрипта есть объявление метки
skip:
LevelSearch
wait(4)
Есть кусок кода, в нем цикл и переход на метку LevelSearch
$wait_home = 0
WHILE($wait_home = 0)
GETSCREEN
COLORMODE(6)
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "home.bmp", -1, 75)
$wait_home = 1
MOVE($_return1+3, $_return2+3)
WAITMS(100)
LCLICK($_return1+3, $_return2+3)
GOTO(LevelSearch)
END_IF
wait(5)
END_CYC
Вопрос - правильно ли я понял конструкцию переходов? и второй - в случае успешного поиска в цикле - перейдет - ли исполнение сразу на метку или сперва выполнится wait(5)
-
И добавлю что выпрыгивать через ГОТО из циклов и подпрограмм нельзя, также как и впрыгивать, это не приведет к ошибке но ломает логику, в дальнейшем могут возникнуть необъяснимые глюки . Цикл должен корректно завершаться и после этого через условие можно прыгать куда угодно.
-
Понял, всем спасибо. Будем ковырять дальше =)
-
Вот это нежданчик. Работаю удаленно на другом компьютере через teamviewer, похоже, что зараза кликерманн как-то неправильно координаты мыши считывает. Спасибо!
Скорее всего причина в эмуляторе bluestacks. Там не учитывается строка заголовка, поэтому смещение координат для кликермэна идёт на её высоту.
-
Вот код:
$AUTOFIGHT = 0
AUTOFIGHT:
IF $AUTOFIGHT = 0
wait(10)
GETSCREEN
COLORMODE(6)
IF_PICTURE_IN (100,750, 173,810, "off.bmp", -1, 75)
MOVE($_return1+3, $_return2+3)
WAITMS(100)
LCLICK($_return1+3, $_return2+3)
else
LOGWRITE ("not found - off")
END_IF
$AUTOFIGHT = 1
END_IF
Дальше идет код, после исполнения которого идет переход в метку AUTOFIGHT
В моем понимании представленная проверка if else проходит 1 раз при запуске, а при повторном попадании $AUTOFIGHT уже равен 1 и проверка должна пройти мимо. Но этого не происходит и LOGWRITE ("not found - off") всплывает несколько раз. Вопрос - почему?
-
Потому что ты забыл скобки в условии поставить.
IF ($AUTOFIGHT = 0)
-
Holy shit! Thanks =)
-
А можно сделать свою функцию, чтобы просто передавать туда свои параметры и вызвать ее в произвольном месте
IF_PICTURE_IN ($px1,$py1, $px2,$py2, $picture, -1, 90)
$wait_level = 1
WAITMS(500)
MOVE($_return1+3, $_return2+3)
WAITMS(500)
LCLICK($_return1+3, $_return2+3)
END_IF
как альтернативой пользуюсь сейчас метками, но подумал - может есть что-то удобнее?
-
А можно сделать свою функцию, чтобы просто передавать туда свои параметры и вызвать ее в произвольном месте
Конечно! Есть подпрограммы.
// подпрограмма должна быть описана в верхней части скрипта выше вызова, и не может быть вложена во что либо.
SUB(Поиск, $px1,$py1, $px2,$py2, $picture)
$wait_level = 0
WHILE($wait_level = 0)
GETSCREEN
IF_PICTURE_IN ($px1,$py1, $px2,$py2, $picture, -1, 100)
$wait_level = 1
MOVE($_return1+3, $_return2+3)
WAITMS(500)
LCLICK($_return1+3, $_return2+3)
WAITMS(500)
ELSE
WAITMS(50)
END_IF
END_CYC
END_SUB
Поиск(100,100, 400,400, "file 1.bmp") // вызовы
Поиск(400,400, 500,500, "file 2.bmp")
Поиск(0,0, $_xmax,$_ymax, "file 3.bmp")
-
Спасибо! То, что надо.