Помимо функции поиска цвета, которую можно вызвать из шаблона (описание этой функции есть тут ). Можно использовать также функцию:
Function FindColorInCoord(Left, Top, Right, Bottom: Cardinal; ColorName: string; sensitivity: Cardinal; ScreenName: string;var R:Trect): Boolean; — найти цвет в произвольных координатах
Также в поиске динамических объектов реализована и функция поиска цвета. Причем если функция выше возвращает координаты прямоугольника внутри области поиска, в которой есть заданный цвет, т.е. даже если в области несколько фрагментов с цветом, то функция все равно вернет 1 прямоугольник в который попадут все фрагменты. То поиск цветов в динамических объектах сегментирует все фрагменты найденного цвета и возвращает их в виде массива, по которому можно перемещаться с помощью команд First, Next,Previous. Также динамические объекты могут искать цвета в параллельном потоке, если установлено свойство RegularSearch в значение true, то поиск цветов будет выполнятся параллельно выполнению основной программы с частотой указанной в свойстве RefreshPeriod. Чтобы динамический объект искал именно цвет, а не движение нужно присвоить свойству Mode значение 2. В свойстве QtyShots — при этом указываем количество скриншотов которые необходимо проанализировать, т.е. если указать тут 2, то если цвет будет только на одном из 2х подряд идущих скриншотах, то в итоговый массив найденных цветов он все равно попадет.
Пример поиска цветов с помощью динамических объектов:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
if Overview.FindPicture then //находим шаблон, внутри которого будем мы искать цвета begin //задаем динамическому объекту FindNPC область в которой он будет работать, // т.е. внутри найденного шаблона FindNPC.SetRect(Overview.Left,Overview.Top,Overview.Right,Overview.Bottom); //получаем массив найденных цветов(или ищем, если работаем не в параллельном потоке) if FindNPC.Refresh then begin //позиционируемся на первом элементе полученного массива if FindNPC.First then begin //далее выполняем цикл по остальным фрагментам цвета repeat //теперь в свойствах Top,Bottom,Right,Left у нас координаты // первого фрагмента из массива, делаем //с ними что хотим //(а на следующей итерации второго, третьего и т.д. фрагметов) //высота фрагмента y := FindNPC.Bottom - FindNPC.Top; //ширина фрагмента x := FindNPC.Right - FindNPC.Left; //.....ит.д. код программы //закончили делать что-то с одним элементом массива цветов и until not FindNPC.next; //переходим к следующему элементу массива цветов end else LNPCCount.Caption := 'массив с цветами пустой!'; end else LNPCCount.Caption := 'Цвет не найден'; end |