Кибор » Кибор - Интегрированная среда разработки ботов » Вопросы и решение проблем » Внутри функции не работает поиск скученностей пикселей

Страниц (1): [1]
 

1. mikeee - 11 Июня, 2015 - 00:25:19 - перейти к сообщению
Доброго всем дня!
Не работает поиск скученностей пикселей. Просто в коде работает. Второй раз, внутри функции - не хочет.
Ниже код. В нём два раза делается поиск. Первый цикл работает.
А второй (вложенный, сделанный функцией) не пашет.
1. Находит не голубые, а белые или около того цвета.
2. Методом тыка задаю ему область где искать -400, -150, 500, 500. Не понимаю почему не работает 0,0,1024,768.

Кто имеет опыт, подскажите, где я ошибся. Уже 2,5 часа бьюсь.

CODE:
aa=window ("Каталог", "#32770", window (...
activate(aa);

int min_col=3;//Найти если все три цвета
int r=10; // это плюс минус для значений R,G и B
int color[3];
int color2[3];
color[0]=12218368; color[1]=15245824; color[2]=12231350;//Тут цвета для уровня 1
color2[0]=14453575; color2[1]=14453575; color2[2]=14453575;//Тут цвета для уровня 2
int kol[3];
kol[0]=1; kol[1]=1; kol[2]=1;//Тут сколько должно совпасть пикселей для каждого цвета
int x[50], y[50];//Тут координаты найденные для уровня 1
int x2[50], y2[50];//Тут координаты найденные для уровня 2
int colors, xw, yw;
getdisplay(colors, xw, yw); // снимаем глубину цвета и размер экрана


int m=0;
d:if (m<4) // цикл продвижения скролла (на 4 экрана)
{
activate(aa);
// снимаем все скученности
int k=findheapcolor(20, #color[0], #kol[0], 3, 3, #x[0], #y[0], 15, 15, 350, 50, 0, 0, xw, yw, r, r, r, r, r, r, -1);
textbkcolor (8454143,255);
//messagebox (format(k)+" скученностей на 1м экране");

int n=0;

s:if (n<k) // цикл перебирающий экран 1го уровня
{
textout(n, x[n], y[n] , format(n), 0);
mousemove(x[n], y[n]);
sleep(1000);
mouse(LEFT);
//messagebox ("клик");
perebor_level2(n);
sleep(2000);
n++;
goto s;
} // ! цикл перебирающий экран каталога 1го уровня

messagebox (format(k)+" ссылок нашли на 1м уровне");
mouse(LEFT,932, 560);
sleep(100);

m++;
goto d;
}// ! цикл продвижения скролла (на 4 экрана)

// ФУНКЦИИ ================================
function perebor_level2(int n)
{
messagebox ("Начинаем перебор второго уровня. Итерация " + format(n+1));

sleep(1000);

// снимаем все скученности
int k2=findheapcolor(50, #color2[0], #kol[0], 1, 1, #x2[0], #y2[0], 15, 15, 10, 10, -400, -150, 500, 500, r, r, r, r, r, r, -1);
textbkcolor (8454143,255);
messagebox ("Нарыли скученностей: " + format(k2));
int n2=0;

s2:if (n2<k2) // цикл перебирающий экран каталога 2го уровня
{
textout(n2, x2[n2], y2[n2] , format(n2), 0);
mousemove(x2[n2], y2[n2]);
sleep(100);


n2++;
goto s2;
} // ! цикл перебирающий экран каталога 2го уровня

messagebox (format(k2)+" ссылок нашли на втором уровне. Возвращаемся на первый.");
sleep(2000);
mouse(LEFT, 446, 192); // клик на Ссылке в каталоге возврат на уровень выше

}
2. Kibor - 11 Июня, 2015 - 01:02:37 - перейти к сообщению
 mikeee пишет:
Методом тыка задаю ему область где искать -400, -150, 500, 500. Не понимаю почему не работает 0,0,1024,768

тык не правильный.
координаты экрана не могут быть в минус

mousemove(x2[n2], y2[n2]);
при не нулевых координатах старта поиска надо делать смещение

пример

findheapcolor(50, #color2[0], #kol[0], 1, 1, #x2[0], #y2[0], 15, 15, 10, 10, 120, 250, 500, 500, r, r, r, r, r, r, -1);
mousemove(x2[n2]+120, y2[n2]+250);
3. mikeee - 11 Июня, 2015 - 04:04:22 - перейти к сообщению
Спасибо. Только так тоже не работало.
вместо
CODE:
dx, dy, 500, 500

должно быть так:
CODE:
dx, dy, dx+500, dy+500


Вот так заработало:
CODE:

win aa=window (...);
activate(aa);

// общие ------------------------------------------------------------------------
int min_col=3;//Найти если все три цвета
int r=10;
int kol[3];
kol[0]=1; kol[1]=1; kol[2]=1;//Тут сколько должно совпасть пикселей для каждого цвета
int colors, xw, yw;
getdisplay(colors, xw, yw);
textbkcolor (8454143,255);
int dx = 400;
int dy = 200;


int color2[3];
color2[0]=12087576; color2[1]=12087576; color2[2]=12087576;//Тут цвета
int x2[50], y2[50];//Тут координаты найденные
int k2=findheapcolor(50, #color2[0], #kol[0], 3, min_col, #x2[0], #y2[0], 15, 15, 400, 17, dx, dy, dx+500, dy+500, r, r, r, r, r, r, -1);

int n2=0;
s2:if (n2<k2)
{
textout(n2, x2[n2] + dx, y2[n2] + dy, format(n2), 0);
mousemove(x2[n2] + dx, y2[n2] + dy);
sleep(100);
n2++;
goto s2;
}
sleep(1000);

messagebox (format(k2)+" объектов нашли");
// блок перебора --------------------------

(Добавление)
И ещё вопрос: А как почистить продукт жизнедеятельности этой строчки?
CODE:
textout(n2, x2[n2] + dx, y2[n2] + dy, format(n2), 0);

После того как она в цикле поработала - весь экран в цифрах.
Перед работой следующего цикла нужно почистить экран.
4. Kibor - 11 Июня, 2015 - 04:21:49 - перейти к сообщению
Первый параметр - номер сообщения. Нумеруются от 0 до 9999. По этому номеру потом можно обновлять текст.
Второй - позиция по X от левого верхнего угла.
Третий - позиция по Y от левого верхнего угла.
Координаты экранные.
Четвертый - текст в string или char
Пятый - может быть 0 или 1 или 2.
0 - Будучи напечатанным при изменение длины строки на меньшую или сдвиге позиции этого текста не обновляет за собой экран.
1 - При изменение длины или позиции обновляет за собой часть экрана на объекте на котором напечатано.
2 - При изменение длины или позиции обновляет весь экран.


disabletextout
resettextout (для просмотра ссылки Вам необходимо авторизоваться)
5. mikeee - 11 Июня, 2015 - 04:30:53 - перейти к сообщению
Благодарю за оперативный и полный ответ!

Powered by ExBB FM 1.0 Final