Что нового

[Мышь, клавиатура] Как найти нужный рисунок на экране ?

KEO

Новичок
Сообщения
26
Репутация
0
Добрый день. Я новичок. Если вдруг создал тему не там или еще что нибудь - просьба сильно не ругаться. :smile:

Суть темы: я играю в онлайн игрушку. Скажем так: в ней периодически появляется рисунок (я бы даже сказал несколько однотипных рисунков), на которые надо щёлкнуть.

Суть проблемы: надо написать скрипт, который ищет на экране заданный рисунок и щёлкает по нему (ну например в центр этого рисунка). Естественно, если таких рисунков на экране будет несколько - надо чтобы последовательно щёлкнуло по всем.

Собственно вопрос темы: как это сделать ? Есть какой нибудь пример кода ?


P.S. Я хоть и новичок, но кое какие понятия имею. Ранее программил в ВизуалБейсике, Дельфи и т.п. Ну то есть я хочу сказать, что в принципе разберусь. Мне бы только кусок кода увидеть. Заранее всем ответившим спасибо.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
KEO

Возможный вариант:

http://autoit-script.ru/index.php?topic=14069.msg88913#msg88913
 
Автор
K

KEO

Новичок
Сообщения
26
Репутация
0
Да, очень похоже, что это то что нужно. Спасибо, буду разбираться. :smile:


Добавлено:
Сообщение автоматически объединено:

В посту №4 предложенной вами темы есть интересный вариант кода. В посту №7 форумчанин Garrett тоже привел какой то пример, но с ним я пока не разбирался. Но обязательно посмотрю позже. Сейчас у меня возникли несколько вопросов по вашему примеру.

Ну в принципе, основная часть кода ясна. Но есть ряд недопонятых мною моментов, уточнив которые - я разберусь окончательно в этом вопросе. Если можно - я по пунктам.

1. Интересует строка
$bData1 = DllStructGetData(DllStructCreate('byte[' & ($Width * $Height * 4) & ']', DllStructGetData($tMap, 'Scan0')), 1)

Я так понимаю - это перевод графических данных (искомого рисунка) в строку для дальнейшего его сравнения с такой же (преобразованной) строкой скрина окна. А можете написать по-подробнее: что в этой строке и для чего ? Ну например: почему берем значение "byte" ? Зачем нам умножать длину и ширину рисунка на 4 ? Что такое "Scan0", откуда оно берется ?

2. Строка
$bData1 = StringTrimLeft($bData1, 2)
Вопрос: зачем мы полученной строке обрезаем с конца 2 элемента ? Для какой цели ?

3. Строка
$countstring = StringMid($bData1, 1, $Width * 8)
Тут, как я понимаю, мы берем кусок от строки.
Вопрос: А почему именно ширину умножаем на 8 ?

4. Строки
$y = (Ceiling($sTring1 / $Width) - 1) / 8
$x = (Mod($sTring1, $Width) - 1) / 8

То же самое: не понятное деление на "8".

Подробной помощи в этих вопросах я был бы очень благодарен :smile: , но если уж совсем лень расписывать, то буду рад и кратким ответам. Заранее огромное спасибо.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
KEO

1. Интересует строка
$bData1 = DllStructGetData(DllStructCreate('byte[' & ($Width * $Height * 4) & ']', DllStructGetData($tMap, 'Scan0')), 1)

Тут я и сам особо не вникал)
Вроде как создаем структуру, добавляем в нее байты из изображения, а потом получаем целиком эти данные в виде строки.

Про структуры можно почитать в справке, и, например, здесь:
http://autoit-script.ru/index.php?topic=2849.msg20887#msg20887

2. Строка
$bData1 = StringTrimLeft($bData1, 2)
Вопрос: зачем мы полученной строке обрезаем с конца 2 элемента ? Для какой цели ?
Не с конца, а с начала.
Все просто, строка такая:
Код:
0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF....
где - FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - полезные данные, соответственно, 0x лучше удалить

3. Строка
$countstring = StringMid($bData1, 1, $Width *
Тут, как я понимаю, мы берем кусок от строки.
Вопрос: А почему именно ширину умножаем на 8 ?

4. Строки
$y = (Ceiling($sTring1 / $Width) - 1) / 8
$x = (Mod($sTring1, $Width) - 1) / 8

Потому что каждый пиксель из картинки в строке представлен 8 символами, например, FF000000 - черный цвет
Т.е. число символов в строке = (высота картинки * ширину картинки) * 8 + в начале добавлены те самые 0x
И чтобы взять какой-то пиксель из строки, нужно знать его порядковый номер и умножать этот номер на 8.


Вообще, тут на форуме в основном я рекомендую такие варианты, и возможно, они не лучшие.
Обычно используют dll ImageSearch или обычный PixelSearch
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
KEO,
Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Глобальный модератор.
 
Верх