Kwaga |
Отправлено: 16 Марта, 2022 - 02:02:20
|
Наблюдатель
Покинул форум
Сообщений всего: 30
Дата рег-ции: Март 2022
Репутация: 1
|
Zireael пишет: Проще через findimage искать изображение пустого слота. Функция вернёт количество.
Там фон полупрозрачный((
И из за этого пустой слот все время выглядит по разному в зависимости от происходящего на экране. Только при наведении мышки подсветка белым, слота, детектится всегда четко.(Отредактировано автором: 16 Марта, 2022 - 02:05:33) |
|
|
Zireael |
Отправлено: 16 Марта, 2022 - 02:29:44
|
Эксперт
Покинул форум
Сообщений всего: 4465
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: Там фон полупрозрачный
Для этого в findimage есть параметр разбежность цвета. Подобрать можно во вкладке графика, фильтр динамики.(Отредактировано автором: 16 Марта, 2022 - 02:30:15) |
|
|
Kwaga |
Отправлено: 16 Марта, 2022 - 03:53:36
|
Наблюдатель
Покинул форум
Сообщений всего: 30
Дата рег-ции: Март 2022
Репутация: 1
|
Zireael пишет: Цитата: Там фон полупрозрачный
Для этого в findimage есть параметр разбежность цвета. Подобрать можно во вкладке графика, фильтр динамики.
Спасибо.
Я просто полагал что фильтр динамики для движущихся объектов.
Update.
Попробовал, очень долго ищет иногда даже Кибор зависает). В общем не добиться 100% детекта при разном заднем фоне(
(Добавление)
К тому же не понятно какой кусок вырезать и как искать, если например слот занят.
[img](для просмотра ссылки Вам необходимо авторизоваться) /img](Отредактировано автором: 16 Марта, 2022 - 04:12:40) |
|
|
Kibor |
Отправлено: 16 Марта, 2022 - 08:07:18
|
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Пройтись в цикле по каждой ячейке такой функцией.
CODE:pause(1000);
int r=70;
//593, 590 это координаты каждой ячейки в точке указанной на рисунке
if (scan_slot(593, 590)==1)messagebox ("Слот не пустой");
else messagebox ("Слот пустой");
function scan_slot(int стартx, int стартy)
{
int финишx=стартx+40, финишy=стартy+40;
if (sumcolor(-1, стартx, стартy, финишx, финишy, 4866368, r, r, r, r, r, r, -1)<1600) return 1;
else return 0;
}
Нажмите для увеличения
|
|
|
Kwaga |
Отправлено: 16 Марта, 2022 - 10:50:39
|
Наблюдатель
Покинул форум
Сообщений всего: 30
Дата рег-ции: Март 2022
Репутация: 1
|
Kibor пишет: Пройтись в цикле по каждой ячейке такой функцией.
CODE:pause(1000);
int r=70;
//593, 590 это координаты каждой ячейки в точке указанной на рисунке
if (scan_slot(593, 590)==1)messagebox ("Слот не пустой");
else messagebox ("Слот пустой");
function scan_slot(int стартx, int стартy)
{
int финишx=стартx+40, финишy=стартy+40;
if (sumcolor(-1, стартx, стартy, финишx, финишy, 4866368, r, r, r, r, r, r, -1)<1600) return 1;
else return 0;
}
Нажмите для увеличения
Спасибо за участие.
Я возможно не правильно описал проблему.
Проблема в том что предмет в слоте может быть любым, как и фон за ячейками, так как он прозрачный.
Я примерно понял как проверять каждую ячейку. Но как я и писал в первом посте, единственный вариант на 100% определить пустая она или нет - это навести на нее мышку, тогда она заливается белым цветом и scanpixel четко определяет это. Единственное моих знаний пока что не хватает, как мне пройдясь по каждой ячейки и определив количество свободных записать это в какую то переменную что бы потом ее использовать в loop. |
|
|
Kibor |
Отправлено: 16 Марта, 2022 - 10:59:06
|
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Kwaga пишет: Проблема в том что предмет в слоте может быть любым, как и фон за ячейками, так как он прозрачный.
Это понятно.
Что бы понять какую ставить разбежность надо сделать 2 скрина. Один когда под ячейками самый светлый цвет фона. Второй самый темный. Тут стоит разбежность 70, что в принципе должно сработать на любом фоне и не пропустить какой то объект в ячейке.
А как обойти все ячейки? В цикле, подставляя координаты каждой ячейки в точке на скрине..
CODE://Таблица 5 на 3
int X[5]={100, 170, 240, 310, 380}//Координаты по x
int Y[3]={200, 270, 340}//Координаты по y
for (int x=0; x<5; x++)
{
for (int y=0; y<3; y++)
{
if (scan_slot(X[x], Y[y])==1)messagebox ("Слот не пустой");
else messagebox ("Слот пустой");
}
} |
|
|
Kwaga |
Отправлено: 16 Марта, 2022 - 11:01:34
|
Наблюдатель
Покинул форум
Сообщений всего: 30
Дата рег-ции: Март 2022
Репутация: 1
|
Kibor пишет: Kwaga пишет: Проблема в том что предмет в слоте может быть любым, как и фон за ячейками, так как он прозрачный.
Это понятно.
Что бы понять какую ставить разбежность надо сделать 2 скрина. Один когда под ячейками самый светлый цвет фона. Второй самый темный. Тут стоит разбежность 70, что в принципе должно сработать на любом фоне и не пропустить какой то объект в ячейке.
А как обойти все ячейки? В цикле, подставляя координаты каждой ячейки в точке на скрине..
Про фон понял, буду пробовать. Единственное не понял количество какого цвета считать в sumcolor и как в итоге записать количество свободных слотов в переменную)
Простите за мою тупость, только постигаю все это)
И пока что понимаю только визуальный редактор.(Отредактировано автором: 16 Марта, 2022 - 11:04:15) |
|
|
Kibor |
Отправлено: 16 Марта, 2022 - 11:04:00
|
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Обойти в цикле
CODE://Таблица 5 на 3
int X[5]={100, 170, 240, 310, 380}//Координаты по x
int Y[3]={200, 270, 340}//Координаты по y
for (int x=0; x<5; x++)
{
for (int y=0; y<3; y++)
{
if (scan_slot(X[x], Y[y])==1)messagebox ("Слот не пустой");
else messagebox ("Слот пустой");
}
}
(Добавление)
Kwaga пишет: не понял количество какого цвета считать в sumcolor
Если сканируется прямоугольник 40 на 40, то там 1600 пикселей.
Почитайте про функцию sumcolor
(Добавление)
Kwaga пишет: И пока что понимаю только визуальный редактор.
Там тоже есть циклы и все что надо. Но понимать что тут написано надо для понятия алгоритма. |
|
|
|