Приветствую!
Гуру помогите пожалуйста, есть инвентарь, нужно посчитать количество слотов свободных и записать это в какую то переменную, что бы потом использовать это количество для цикла loop.
Логика такая:
1. Перемещаю мышку в правый нижний угол каждого слота
2. Слот подсвечивается белым цветом
3. ScanPixel проверяет центр слота
4. Если он пустой будет белый цвет, соответственно свободен (записываем +1 к количеству свободных слотов)
5. Если слот не белый значит занят(ничего не записываем к количеству свободных слотов)
Не хватает знаний пока что((( Пытаюсь это сделать в визуальном редакторе.
[img](для просмотра ссылки Вам необходимо авторизоваться) /img]
1. Kwaga - 15 Марта, 2022 - 17:06:07 - перейти к сообщению
2. Zireael - 15 Марта, 2022 - 18:58:02 - перейти к сообщению
Проще через findimage искать изображение пустого слота. Функция вернёт количество.
3. Kwaga - 15 Марта, 2022 - 19:02:20 - перейти к сообщению
Zireael пишет:
Проще через findimage искать изображение пустого слота. Функция вернёт количество.
Там фон полупрозрачный((
И из за этого пустой слот все время выглядит по разному в зависимости от происходящего на экране. Только при наведении мышки подсветка белым, слота, детектится всегда четко.
4. Zireael - 15 Марта, 2022 - 19:29:44 - перейти к сообщению
Цитата:
Там фон полупрозрачный
Для этого в findimage есть параметр разбежность цвета. Подобрать можно во вкладке графика, фильтр динамики.
5. Kwaga - 15 Марта, 2022 - 20:53:36 - перейти к сообщению
Zireael пишет:
Цитата:
Там фон полупрозрачный
Для этого в findimage есть параметр разбежность цвета. Подобрать можно во вкладке графика, фильтр динамики.
Спасибо.
Я просто полагал что фильтр динамики для движущихся объектов.
Update.
Попробовал, очень долго ищет иногда даже Кибор зависает). В общем не добиться 100% детекта при разном заднем фоне(
(Добавление)
К тому же не понятно какой кусок вырезать и как искать, если например слот занят.
[img](для просмотра ссылки Вам необходимо авторизоваться) /img]
6. Kibor - 16 Марта, 2022 - 01:07:18 - перейти к сообщению
Пройтись в цикле по каждой ячейке такой функцией.
Нажмите для увеличения
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;
}
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;
}
Нажмите для увеличения
7. Kwaga - 16 Марта, 2022 - 03:50:39 - перейти к сообщению
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;
}
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.
8. Kibor - 16 Марта, 2022 - 03:59:06 - перейти к сообщению
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 ("Слот пустой");
}
}
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 ("Слот пустой");
}
}
9. Kwaga - 16 Марта, 2022 - 04:01:34 - перейти к сообщению
Kibor пишет:
Kwaga пишет:
Проблема в том что предмет в слоте может быть любым, как и фон за ячейками, так как он прозрачный.
Это понятно.
Что бы понять какую ставить разбежность надо сделать 2 скрина. Один когда под ячейками самый светлый цвет фона. Второй самый темный. Тут стоит разбежность 70, что в принципе должно сработать на любом фоне и не пропустить какой то объект в ячейке.
А как обойти все ячейки? В цикле, подставляя координаты каждой ячейки в точке на скрине..
Про фон понял, буду пробовать. Единственное не понял количество какого цвета считать в sumcolor и как в итоге записать количество свободных слотов в переменную)
Простите за мою тупость, только постигаю все это)
И пока что понимаю только визуальный редактор.
10. Kibor - 16 Марта, 2022 - 04:04:00 - перейти к сообщению
Обойти в цикле
(Добавление)
Если сканируется прямоугольник 40 на 40, то там 1600 пикселей.
Почитайте про функцию sumcolor
(Добавление)
Там тоже есть циклы и все что надо. Но понимать что тут написано надо для понятия алгоритма.
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 ("Слот пустой");
}
}
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 пишет:
И пока что понимаю только визуальный редактор.
Там тоже есть циклы и все что надо. Но понимать что тут написано надо для понятия алгоритма.