Привет!
Есть поток, в нем крутиться постоянно проверка определенной области экрана. Внутри проверка вида:
getscreen(671,309, 708,401)
IF_PICTURE_IN(671,309, 708,401, "somepict.bmp")
LOGWRITE("OK")
somesub()
ELSE
LOGWRITE("Not OK")
END_IF
wait(1)
Проблема: при любом состоянии экрана условие срабатывает.
Подробнее:
Искомая картинка однородного цвета, залита полностью. Скрипт к окну не привязан, потоков штук 10, один главный, остальные - контроль.
Неожиданно заметил, что в логе присутствует сообщение из этого условия, хотя на экране в искомом месте картинка меняется, т.е. статичный сэмпл ну никак не может в этом месте находиться. Сразу решил проверить это условие отдельно - скопировал его в новое окно в редакторе и давай там же запускать. Все то же самое - условие срабатывает. В целях проверки добавил scanpicture с выводом в лог координат и SCREENSHOTEX:
getscreen(671,309, 708,401)
IF_PICTURE_IN(671,309, 708,401, "somepict.bmp")
LOGWRITE("OK")
scanpicture(671,309, 708,401, "somepict.bmp")
while (arrsize($var) > 0)
$y = arrpop($var)
$x = arrpop($var)
print($x,":", $y)
end_cyc
SCREENSHOTEX(671,309, 708,401)
somesub()
ELSE
LOGWRITE("Not OK")
END_IF
wait(1)
Но увы, scanpicture координат картинки не видит. И SCREENSHOTEX сохраняет правильные участки с динамикой, сымпла на них нет. В конце концов добавил в начало getscreen без координат и проверочный скрипт заработал корректно. Код под спойлером:
[spoiler]
getscreen
getscreen(671,309, 708,401)
IF_PICTURE_IN(671,309, 708,401, "somepict.bmp")
LOGWRITE("OK")
scanpicture(671,309, 708,401, "somepict.bmp")
while (arrsize($var) > 0)
$y = arrpop($var)
$x = arrpop($var)
print($x,":", $y)
end_cyc
SCREENSHOTEX(671,309, 708,401)
somesub()
ELSE
LOGWRITE("Not OK")
END_IF
wait(1)
[/spoiler]
Обрадовался. И тут читаю на форуме, что работа из окна редактора не рекомендуется и можно посмотреть, что скрипт видит под курсором мыши
. Громко вздыхаю, загружаю основной скрипт, запускаю НЕ из редактора и... Условие опять срабатывает!. Открываю редактор, нажимаю лупу, навожу на искомую область - ну никак там не может быть сэмпла, все двигается, мерцает и моргает, а сэмпл (я повторюсь) просто прямоугольник залитый одним цветом. Добавил также scanpicture в основной скрипт - не находит сэмпл. А условие все равно срабатывает
. Getscreen без координат в основном уже есть, т.е. постоянно экран обновляется полностью. Размер сэмпла в высоту чуть меньше размера области поиска, да просто глазами видно, что не должно срабатывать условие.
Краткая суть бага: иногда, при определенных условиях, конструкция GETSCREEN(x,y,x1,y1) - IF_PICTURE_IN работает некорректно и может возвращать неправильный результат (человеческим языком - находит картинки там, где их нет)
ЗЫ Расписал все подробно, из уважения к автору
. Классная прога. И вообще, этот баг мне жить не мешает, можно заменить тем же scanpicture и все заработает, но как бы может в натуре баг