Что нового

Как обойти невозможность использования Bitmap из файла в FastFind?

argeee

Новичок
Сообщения
5
Репутация
0
Доброго времени суток, дамы и господа.
Я начал изучать возможности AutoIt только позавчера.
Прошу ответить, глупа ли моя идея, или вполне имеет право на жизнь?

Задача:
Есть несколько кнопок, изображение на которых зависит от состояния связанных с этими кнопками игровых объектов. m кнопок, n состояний (состояние одинаковые для каждой из кнопок). Надо следить за изображением кнопки и выполнять, в зависимости от паттерна то, или иное действие.
Все координаты статичны.

Как это вижу я:
1. Считать в память изображения кнопок и сохранить их в качестве снапшотов.
2. Снимать снапшоты текущего состояния кнопок.
3. Циклом прогонять FFIsDifferent (снапшот из памяти, снапшот текущего состояния)
3.1 выполнять действие, в зависимости от того, какая пара снапшотов вернула False

Проблема:
FastFind не предусматривает загрузки Bitmap из файла в качестве снапшота.

Идея:
1. Отрисовать склеенные в подобие спрайта изображения паттернов на кнопках поверх нашего $hWnd,
2. сделать цикл снапшотов эттого участка со смещением на ширину каждого паттера
3. PROFIT!

Прошу указать на грубые ошибки в логике, если таковые имеются, а также помочь с кодом, который я опубликую позже...
 

Jihar

Новичок
Сообщения
6
Репутация
0
Я вижу два варианта решения этой проблемы:
1. Переписать код библиотеки FastFind
2. Переосмыслить логику работы бота, чтобы она подходила под возможности библиотеки в том виде, в котором она есть сейчас.

Для первого потребуются знания C++. Исходники есть на Гитхабе.
Для второго можно попробовать загрузить сюда скриншоты из приложения (игры) которое Вы хотите автоматизировать. Может быть кого-нибудь из уважаемых пользователей нашего форума посетит светлая идея, которая Вам поможет.
 
Автор
A

argeee

Новичок
Сообщения
5
Репутация
0
Jihar сказал(а):
Я вижу два варианта решения этой проблемы:
1. Переписать код библиотеки FastFind
Мой опыт в плюсах пока нулевой.
Jihar сказал(а):
2. Переосмыслить логику работы бота, чтобы она подходила под возможности библиотеки в том виде, в котором она есть сейчас.
То есть описанное мной невозможно реализовать?
Нельзя просто так взять и прорисовать бмп поверх клиентской части окна?
Jihar сказал(а):
Для второго можно попробовать загрузить сюда скриншоты из приложения (игры) которое Вы хотите автоматизировать.
Чуть позже.

Прошу прощения, но я не вижу в Вашем посте ответа на мои вопросы:
"Моя идея глупа?"
"То что я описал - вообще можно реализовать?"
"Есть ли в описанном мной грубые ошибки в логике?"

Заранее благодарю за ответ.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
argeee
Если известно где находится картинка и как она выглядит, то можно попробовать
Код:
PixelChecksum()
 
Автор
A

argeee

Новичок
Сообщения
5
Репутация
0
Спасибо, господа, за ответы.

Пока попробовал вот это:
Код:
$sDestination = @ScriptDir & "\image.bmp"
SplashImageOn("", $sDestination, 101, 101, 0, 0, 1) ; показываю на мгновение BMP размером 100*100
FFSnapShot (1, 1, 101, 10, 0, "") ; загоняю снапшот первой полосы высотой 10 пикселов в слот 0
FFSnapShot (1, 10, 101, 20, 1, "") ; загоняю снапшот второйполосы высотой 10 пикселов в слот 1
FFSnapShot (1, 20, 101, 30, 2, "") ; ну и т.д.
FFSnapShot (1, 30, 101, 40, 3, "")
FFSnapShot (1, 40, 101, 50, 4, "")
FFSnapShot (1, 50, 101, 60, 5, "")
SplashOff() ; закрываю BMP


Этот код успешно нарезал мое изображение на отрезки высотой по 10 пикселов и сохранил их как снапшоты, с которыми потом можно работать напрямую из памяти.

Спасибо всем за дельные советы.
Правда, у меня создалось впечатление, что мой вопрос не читают дальше заголовка.

Alofa сказал(а):
Почитайте внимательно шапку Этой темы. Там и ссылка есть на FastFind 2_2.
Спасибо.
Я внимательно прочитал шапку той темы, менее внимательно прочитал все оставшиеся посты той темы, прочитал файл справки из архива с этой библиотекой.
Не нашел функции загрузки битмапа как снапшота.
InnI сказал(а):
Если известно где находится картинка и как она выглядит, то можно попробовать
Код:
PixelChecksum()
Большое спасибо.
 

Jihar

Новичок
Сообщения
6
Репутация
0
Я искренне надеялся, что эту тему пометят решенной в случае, если будет найден ответ на вопрос в заголовке. Что же, для Автора темы вопрос действительно решен. Однако мне интересен вариант с доработкой самой библиотеки, но знаний моих явно недостаточно.
Дабы не плодить новые темы на форуме, задам вопрос в этой теме (да простит меня уважаемые Автор темы и Модератор)
А есть ли кто-нибудь, кто может подсказать как обойти невозможность использования bitmap в библиотеке FastFind.dll путем доработки самой библиотеки FastFind.dll ?

P.S. я понимаю, что это задача скорее всего, решается не на Autoit ( а на C++) но может быть кто-нибудь из прочитавших данную тему знает C++ достаточно для решения данной проблемы?
 
Автор
A

argeee

Новичок
Сообщения
5
Репутация
0
Jihar сказал(а):
может быть кто-нибудь из прочитавших данную тему знает C++ достаточно для решения данной проблемы?
Я думаю, найдутся.
На сколько я понимаю, нужно прикрутить к библиотеке вызов той же _GDIPlus_BitmapCreateFromFile
Я вижу это примерно так:
Код:
$hBitmap = _GDIPlus_BitmapCreateFromFile (@MyDocumentsDir & "\GDIPlus_Image.bmp")
$hSnapshot = _GDIPlus_GraphicsCreateFromHDC($hBitmap )

в обертке это будет выглядеть как-то так:
Код:
FFSnapshotFromFile (FileName, Left, Top, Right, Bottom, NumOfSnapShot)


Но, я вообще не знаю плюсы, так что всё может быть в разы сложнее, и написанное мной может оказаться дикой дичью.
 

Jihar

Новичок
Сообщения
6
Репутация
0
Я тут внимательно почитал github и заметил вот такие строки
( к сожалению, ссылку оставить не могу, потому что редактор сообщений пишет мне следующее [Извините, вам запрещено оставлять внешние ссылки.] )
LoadFromFile is now implemented, but it seems to introduce some memory
corruption: searchs work fine as far as I can tell after loading, but it
failed to save the loaded bitmap into another file.
FastFrench committed on 4 Feb 2015
Это очень обнадеживает...
 
Автор
A

argeee

Новичок
Сообщения
5
Репутация
0
Черт, у меня
FFIsDifferent(0, 1) всегда возвращает false.
Хотя, если сохранять снапшоты как файлы - видно, что снапшоты имеют разное содержимое.
 
Верх