Limbaugh |
Отправлено: 04 Мая, 2019 - 19:16:22
|
Участник
Покинул форум
Сообщений всего: 86
Дата рег-ции: Май 2019
Репутация: 0
|
Zireael пишет: Так скрипт работает или нет?
Цитата: есть стрелки только не с синим фоном , а с красным
Скрин есть?
Нажмите для увеличения
Вот где красная кнопка, там нужно обратную ей нажать , то есть вниз а не верх(Отредактировано автором: 04 Мая, 2019 - 19:17:59) |
|
|
Limbaugh |
Отправлено: 04 Мая, 2019 - 19:54:25
|
Участник
Покинул форум
Сообщений всего: 86
Дата рег-ции: Май 2019
Репутация: 0
|
Zireael пишет: Тогда через findimage искать.
Да, Я так сначала и пытался сделать, но почему у меня плохо находились изображения стрелок и не получалось сделать
(Добавление)
Zireael пишет: Тогда через findimage искать.
Теперь придется весь код переводить с распознания текста на поиск изображения? или только для красных отдельно сделать поиск изобр. |
|
|
Zireael |
Отправлено: 04 Мая, 2019 - 22:23:45
|
Эксперт
Покинул форум
Сообщений всего: 4461
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: Не составляет труда относительно распознанной стрелки определять цвет пикселя.
Что-то я про это не подумал.
code (Отобразить)CODE:int color_text_KIB_5[1]={16777215} // цвет текста
int coord[4]={750, 787, 1171, 839} // зона поиска
int deltaX=46; // расстояние между стрелками
int pause_=50; // пауза между поиском стрелок
loadsymbolbase("C:\Users\Limbaugh\Desktop\Arrows.sib"); // база для readtext
int color_red=2302945; // цвет красной стрелки
int color_red_min=80; // сколько нужно минимум пикселей найти
int r=10; // разбежность
int fcolorX[999], fcolorY[999]; // массивы для findcolor
int script=0, i, posX;
char text_KIB; // сюда распознаётся текст, 1 символ
enabletimer(0);
loop()
{
textbkcolor (65280, 255);
textout(0, 300, 300, "Запуск/остановка скрипта Ctrl+Z", 1);
while(script)
{
textbkcolor (255, 65280);
textout(0, 300, 300, "Скрипт работает", 1);
// ожидание появления стрелок
loop()
{
if(readtext(RU, #text_KIB, 8, 1, -1, -1, -1, #color_text_KIB_5[0], 1, 5, -1, coord[0], coord[1], coord[2], coord[3], -1))
{
if(symbolcorrect(0)>0.7)
{
posX=coord[0]+symbolxpos(0); break;
}
}
sleep(10);
}
/////////
i=0;
while(posX < coord[2]) // пока не проверили все стрелки
{
mousemove(posX, coord[1]); // можно убрать
sleep(pause_); // можно убрать
mousemove(posX+deltaX, coord[3]); // можно убрать
if(readtext(RU, #text_KIB, 8, 1, -1, -1, -1, #color_text_KIB_5[0], 1, 5, -1, posX, coord[1], posX+deltaX, coord[3], -1))
{
func(text_KIB, i); // вызов функции, которая проверяет корректность символа и нажимает клавиши
posX=posX+deltaX; i++; // смещаем область поиска для readtext
sleep(pause_);
}
else break; // если все стрелки нажаты
}
posX=coord[0];
sleep(10);
}
sleep(10);
}
function func(char c, int number)
{
if(symbolcorrect(0)>0.7) // если корректность символа больше 0.7
{
// поиск красных пикселей
int count_red=findcolor(sizearray(fcolorX), #fcolorX[0],#fcolorY[0], posX, coord[1], posX+deltaX, coord[3], color_red, r,r,r,r,r,r, -1);
if(count_red>color_red_min) // если найдено нужное количество красных пикселей
{
textbkcolor (65280, 255);
textout(9, 300, 380, "Красная стрелка", 1);
textbkcolor (255, 65279);
if(c=='п'){textout(10, 300, 400, format(number)+" Влево", 1); key(37); return;}
if(c=='л'){textout(10, 300, 400, format(number)+" Вправо", 1); key(39); return;}
if(c=='н'){textout(10, 300, 400, format(number)+" Вверх", 1); key(38); return;}
if(c=='в'){textout(10, 300, 400, format(number)+" Вниз", 1); key(40); return;}
}
else
{
textbkcolor (255, 16000000);
textout(9, 300, 380, "Синяя стрелка", 1);
textbkcolor (255, 65279);
if(c=='п'){textout(10, 300, 400, format(number)+" Вправо", 1); key(39); return;}
if(c=='л'){textout(10, 300, 400, format(number)+" Влево", 1); key(37); return;}
if(c=='н'){textout(10, 300, 400, format(number)+" Вниз", 1); key(40); return;}
if(c=='в'){textout(10, 300, 400, format(number)+" Вверх", 1); key(38); return;}
}
}
else
{
textbkcolor (255, 0);
textout(9, 300, 380, "Символ не распознан или некорректен", 1);
}
}
CREATE_TIMER(0, 30)
{
if(getkeystate(CONTROL) && getkeystate(90)) // Ctrl+Z включает/выключает
{
while(getkeystate(CONTROL) && getkeystate(90))sleep(10);
if(script)script=0;
else script=1;
}
}
На скринах работает. Как в игре будет не знаю. |
|
|
Limbaugh |
Отправлено: 05 Мая, 2019 - 00:45:49
|
Участник
Покинул форум
Сообщений всего: 86
Дата рег-ции: Май 2019
Репутация: 0
|
Zireael пишет: Цитата: Не составляет труда относительно распознанной стрелки определять цвет пикселя.
Что-то я про это не подумал.
code (Отобразить)CODE:int color_text_KIB_5[1]={16777215} // цвет текста
int coord[4]={750, 787, 1171, 839} // зона поиска
int deltaX=46; // расстояние между стрелками
int pause_=50; // пауза между поиском стрелок
loadsymbolbase("C:\Users\Limbaugh\Desktop\Arrows.sib"); // база для readtext
int color_red=2302945; // цвет красной стрелки
int color_red_min=80; // сколько нужно минимум пикселей найти
int r=10; // разбежность
int fcolorX[999], fcolorY[999]; // массивы для findcolor
int script=0, i, posX;
char text_KIB; // сюда распознаётся текст, 1 символ
enabletimer(0);
loop()
{
textbkcolor (65280, 255);
textout(0, 300, 300, "Запуск/остановка скрипта Ctrl+Z", 1);
while(script)
{
textbkcolor (255, 65280);
textout(0, 300, 300, "Скрипт работает", 1);
// ожидание появления стрелок
loop()
{
if(readtext(RU, #text_KIB, 8, 1, -1, -1, -1, #color_text_KIB_5[0], 1, 5, -1, coord[0], coord[1], coord[2], coord[3], -1))
{
if(symbolcorrect(0)>0.7)
{
posX=coord[0]+symbolxpos(0); break;
}
}
sleep(10);
}
/////////
i=0;
while(posX < coord[2]) // пока не проверили все стрелки
{
mousemove(posX, coord[1]); // можно убрать
sleep(pause_); // можно убрать
mousemove(posX+deltaX, coord[3]); // можно убрать
if(readtext(RU, #text_KIB, 8, 1, -1, -1, -1, #color_text_KIB_5[0], 1, 5, -1, posX, coord[1], posX+deltaX, coord[3], -1))
{
func(text_KIB, i); // вызов функции, которая проверяет корректность символа и нажимает клавиши
posX=posX+deltaX; i++; // смещаем область поиска для readtext
sleep(pause_);
}
else break; // если все стрелки нажаты
}
posX=coord[0];
sleep(10);
}
sleep(10);
}
function func(char c, int number)
{
if(symbolcorrect(0)>0.7) // если корректность символа больше 0.7
{
// поиск красных пикселей
int count_red=findcolor(sizearray(fcolorX), #fcolorX[0],#fcolorY[0], posX, coord[1], posX+deltaX, coord[3], color_red, r,r,r,r,r,r, -1);
if(count_red>color_red_min) // если найдено нужное количество красных пикселей
{
textbkcolor (65280, 255);
textout(9, 300, 380, "Красная стрелка", 1);
textbkcolor (255, 65279);
if(c=='п'){textout(10, 300, 400, format(number)+" Влево", 1); key(37); return;}
if(c=='л'){textout(10, 300, 400, format(number)+" Вправо", 1); key(39); return;}
if(c=='н'){textout(10, 300, 400, format(number)+" Вверх", 1); key(38); return;}
if(c=='в'){textout(10, 300, 400, format(number)+" Вниз", 1); key(40); return;}
}
else
{
textbkcolor (255, 16000000);
textout(9, 300, 380, "Синяя стрелка", 1);
textbkcolor (255, 65279);
if(c=='п'){textout(10, 300, 400, format(number)+" Вправо", 1); key(39); return;}
if(c=='л'){textout(10, 300, 400, format(number)+" Влево", 1); key(37); return;}
if(c=='н'){textout(10, 300, 400, format(number)+" Вниз", 1); key(40); return;}
if(c=='в'){textout(10, 300, 400, format(number)+" Вверх", 1); key(38); return;}
}
}
else
{
textbkcolor (255, 0);
textout(9, 300, 380, "Символ не распознан или некорректен", 1);
}
}
CREATE_TIMER(0, 30)
{
if(getkeystate(CONTROL) && getkeystate(90)) // Ctrl+Z включает/выключает
{
while(getkeystate(CONTROL) && getkeystate(90))sleep(10);
if(script)script=0;
else script=1;
}
}
На скринах работает. Как в игре будет не знаю.
Вот что получилось, он часто не может распознать, на малых скоростях он лучше распознает
- [vkvideo](для просмотра ссылки Вам необходимо авторизоваться) /vkvideo] |
|
|
Zireael |
Отправлено: 05 Мая, 2019 - 01:06:04
|
Эксперт
Покинул форум
Сообщений всего: 4461
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Подбирайте параметры.
Можно корректность символов уменьшить в двух местах if(symbolcorrect(0)>0.7)
Указать цвет красного пикселя, уменьшить количество пикселей и увеличить разбежность:
Цитата: int color_red=2302945; // цвет красной стрелки
int color_red_min=80; // сколько нужно минимум пикселей найти
int r=10; // разбежность
Для начала откройте скрин в пейнте и проверьте нормально ли в нём находит стрелки.
(Добавление)
В этой строке:
Цитата: posX=coord[0]+symbolxpos(0);
Добавьте:
Цитата: posX=coord[0]+symbolxpos(0)-10; // или чуть меньше 10
Если стрелки начинаются с вверх или вниз, то некорректно потом могут определяться стрелки влево и вправо.(Отредактировано автором: 05 Мая, 2019 - 01:19:42) |
|
|
|