DeLiberate |
Отправлено: 02 Января, 2015 - 15:01:48
|
Участник
Покинул форум
Сообщений всего: 63
Дата рег-ции: Янв. 2015
Репутация: 0
|
Есть код:
start:
проверяем наличие изображения 'A' в области 'OA', если есть - жмем кнопку 'a';
проверяем наличие изображения 'B' в области 'OB', если есть - жмем кнопку 'b';
проверяем наличие изображения 'C' в области 'OC', если есть - жмем кнопку 'c';
и так далее...
goto start;
алгоритм такой:
a;
b;
c;
a;
b;
c;
Проблема: если, например, в данный момент скрипт проверяет область 'B' и в этот же момент искомое изображение появится в области 'A' - кнопка 'а' не нажмется.;
Вопрос: как организовать параллельное выполнение функций поиска? Что то вроде:
a b c;
a b c;
Еще вопрос:
Что быстрее, при условии, что области поиска одинаковы
findimage //размер 2x2
getcolor //по 1 пикселю, берем 4 раза , для точности
findheapcolor //4 пикселя
scanpixel //по 1 пикселю, берем 4 раза , для точности
(Добавление)
код (Отобразить)этот код работает, но хромает. Точность ~90-97%, а нужно 100 CODE:{
a:
win wind=window ("Flash Guitar Hero (FGH) — Opera", "Chrome_WidgetWin_1", -1);
activate (wind);
sleep (300)
int PosX_9999[1];
int PosY_9999[1];
int Image_9999[72][11];
int error=loadimage (#Image_9999[0][0], "C:\Users\Kolya\Documents\pause.bmp");
if (error<1)messagebox(error),pause (10000);
if (findimage(1, #Image_9999[0][0], 0, #PosX_2[0], #PosY_2[0], 972, 653, 1062, 693, wind)==1);
{
visualwindow(0, 806, 792, 1232, 866, 1921, 361 , 300, wind);
}
else
{
goto a;
}
pause 200;
beep(800,100);
enabletimer(0);
int accuracyq=2;
int accuracyqz=2;
int accuracyw=3;
int accuracywz=3;
int accuracye=2;
int accuracyez=2;
int accuracyr=2;
int accuracyrz=2;
int accuracyt=3;
int accuracytz=3;
int accuracyqall=2;
int accuracywall=2;
int accuracyeall=2;
int accuracyrall=2;
int accuracytall=2;
int Image_2[8][7];
int Image_2z[8][7];
int Image_4[8][6];
int Image_4z[8][6];
int Image_1[8][7];
int Image_1z[9][7];
int Image_3[8][7];
int Image_0[8][6];
int Image_0z[8][6];
int Image_rr[8][7];
int Image_all[9][7];
int Image_s_curs[25][35];
loadimage (#Image_s_curs[0][0], "C:\Users\Kolya\Documents\Image_s_curs.bmp");
loadimage (#Image_2[0][0], "C:\Users\Kolya\Documents\Image_1.bmp");
loadimage (#Image_2z[0][0], "C:\Users\Kolya\Documents\Image_1z.bmp");
loadimage (#Image_4[0][0], "C:\Users\Kolya\Documents\Image_x.bmp");
loadimage (#Image_4z[0][0], "C:\Users\Kolya\Documents\Image_4z.bmp");
loadimage (#Image_1[0][0], "C:\Users\Kolya\Documents\Image_c.bmp");
loadimage (#Image_1z[0][0], "C:\Users\Kolya\Documents\Image_cz.bmp");
loadimage (#Image_3[0][0], "C:\Users\Kolya\Documents\Image_v.bmp");
loadimage (#Image_0[0][0], "C:\Users\Kolya\Documents\Image_b.bmp");
loadimage (#Image_rr[0][0], "C:\Users\Kolya\Documents\Image_bz.bmp");
loadimage (#Image_0z[0][0], "C:\Users\Kolya\Documents\Image_0z.bmp");
loadimage (#Image_all[0][0], "C:\Users\Kolya\Documents\Image_all.bmp");
int PosX_2[1];
int PosY_2[1];
int PosX_2z[1];
int PosY_2z[1];
int PosX_4[1];
int PosY_4[1];
int PosX_4z[1];
int PosY_4z[1];
int PosX_1[1];
int PosY_1[1];
int PosX_1z[1];
int PosY_1z[1];
int PosX_0[1];
int PosY_0[1];
int PosX_0z[1];
int PosY_0z[1];
int PosX_3[1];
int PosY_3[1];
int PosX_3z[1];
int PosY_3z[1];
int PosX_allq[1];
int PosY_allq[1];
int PosX_allw[1];
int PosY_allw[1];
int PosX_alle[1];
int PosY_alle[1];
int PosX_allr[1];
int PosY_allr[1];
int PosX_allt[1];
int PosY_allt[1];
int PosX_s_curs[1];
int PosY_s_curs[1];
int v=0;
q:
int nq=findimage(1, #Image_2[0][0], 0, #PosX_2[0], #PosY_2[0], 823, 764, 897, 793, 0, 0, 0, 0, 0, 0, accuracyq, 0, wind); //ищем ноту q
int allq=findimage(1, #Image_all[0][0],0,#PosX_allq[0],#PosY_allq[0], 823, 764, 897, 793, 0, 0, 0, 0, 0, 0, accuracyqall, 0, wind);
int zq=findimage(1, #Image_2z[0][0], 0, #PosX_2z[0], #PosY_2z[0], 823, 764, 897, 793, 0, 0, 0, 0, 0, 0, accuracyqz, 0, wind);
if (allq==1||nq==1||zq==1);
{ //если есть - нажимаем
keydown('q');
// pause (v);
keyup('q');
// update(wind);
}
else
{
//update(wind);
}
w:
int nw=findimage(1, #Image_4[0][0], 0, #PosX_4[0], #PosY_4[0], 913, 759, 971, 796, 0, 0, 0, 0, 0, 0, accuracyw, 0, wind); //ищем ноту w
int allw=findimage(1, #Image_all[0][0], 0, #PosX_allw[0], #PosY_allw[0], 913, 759, 971, 796, 0, 0, 0, 0, 0, 0, accuracywall, 0, wind);
int zw=findimage(1, #Image_4z[0][0], 0, #PosX_4z[0], #PosY_4z[0], 913, 759, 971, 796, 0, 0, 0, 0, 0, 0, accuracywz, 0, wind);
if (allw==1||nw==1||zw==1);
{ //если есть - нажимаем
keydown('w');
// pause (v);
keyup('w');
// update(wind);
}
else
{
// update(wind);
}
e:
int ne=findimage(1, #Image_1[0][0], 0, #PosX_1[0], #PosY_1[0], 988, 758, 1034, 790, 0, 0, 0, 0, 0, 0, accuracye, 0, wind); //ищем ноту e
int alle=findimage(1, #Image_all[0][0], 0, #PosX_alle[0], #PosY_alle[0], 988, 758, 1034, 790, 0, 0, 0, 0, 0, 0, accuracyeall, 0, wind);
int ze=findimage(1, #Image_1z[0][0], 0, #PosX_1z[0], #PosY_1z[0], 982, 756, 1052, 795, 0, 0, 0, 0, 0, 0, accuracyez, 0, wind);
if (alle==1||ne==1||ze==1);
{ //если есть - нажимаем
keydown('e');
// pause (v);
keyup('e');
// update(wind);
}
else
{
// update(wind);
}
r:
int nr=findimage(1, #Image_3[0][0], 0, #PosX_3[0], #PosY_3[0], 1059, 768, 1124, 794, 0, 0, 0, 0, 0, 0, accuracyr, 0, wind); //ищем ноту r
int allr=findimage(1, #Image_all[0][0], 0, #PosX_allr[0], #PosY_allr[0], 1059, 768, 1124, 794, 0, 0, 0, 0, 0, 0, accuracyrall, 0, wind);
int zr=findimage(1, #Image_rr[0][0], 0, #PosX_3z[0], #PosY_3z[0], 1056, 761, 1127, 793, 0, 0, 0, 0, 0, 0, accuracyrz, 0, wind);
if
(allr==1 || nr==1 || zr==1);
{
keydown('{');
// pause (v);
keyup('{');
// update(wind);
}
else //если есть - нажимаем
{
// update(wind);
}
t:
int nt=findimage(1, #Image_0[0][0], 0, #PosX_0[0], #PosY_0[0], 1131, 764, 1200, 796, 0, 0, 0, 0, 0, 0, accuracyt, 0, wind);
int allt=findimage(1, #Image_all[0][0], 0, #PosX_allt[0], #PosY_allt[0], 1131, 764, 1200, 796, 0, 0, 0, 0, 0, 0, accuracytall, 0, wind);
int zt=findimage(1, #Image_0z[0][0], 0, #PosX_0z[0], #PosY_0z[0], 1131, 764, 1200, 796, 0, 0, 0, 0, 0, 0, accuracytz, 0, wind); //ищем ноту t
if (allt==1 || nt==1 || zt==1);
{ //если есть - нажимаем
keydown('}');
// pause (v);
keyup('}');
// update(wind);
}
else
{
// update(wind);
}
}
goto q;
} Спасибо за терпение
(Добавление)
код_второй кусок (Отобразить)этот код работает, но хромает. Точность ~90-97%, а нужно 100 CODE:////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CREATE_TIMER(0, 10000)
{
if (int aq=getkeystate(q), int aw=getkeystate(w), int ae=getkeystate(e), int ar=getkeystate({), int at=getkeystate(}));
(aq!=1&&aw!=1&&ae!=1&&ar!=1&&at!=1);
{
if
(int check=findimage(1, #Image_s_curs[0][0], 0, #PosX_s_curs[0], #PosY_s_curs[0], 993, 634, 1035, 684, wind)==1);
{
mouse(LEFT, 1317, 399, 1, wind);
}
else
{
}
}
else
{
}
{
if (getkeystate(END)==1);
{
close();
}
else
{
}
} Еще раз Спасибо |
|
|
Kibor |
Отправлено: 02 Января, 2015 - 17:24:18
|
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
DeLiberate пишет: Что быстрее
findimage
многопоточности нет. она и не нужна тут.
есть таймер(для просмотра ссылки Вам необходимо авторизоваться)
DeLiberate пишет: Проблема: если, например, в данный момент скрипт проверяет область 'B' и в этот же момент искомое изображение появится в области 'A' - кнопка 'а' не нажмется.;
если есть из. B
{
если нет из. A
{
наж. a
}
}
так возможно? |
|
|
DeLiberate |
Отправлено: 02 Января, 2015 - 18:13:31
|
Участник
Покинул форум
Сообщений всего: 63
Дата рег-ции: Янв. 2015
Репутация: 0
|
Kibor пишет:
если есть из. B
{
если нет из. A
{
наж. a
}
}
так возможно?
То есть:
Спойлер (Отобразить)CODE:если есть из. В && нет из. A && нет из. С
то {нажать b}
если есть из. A && нет из. B && нет из. C
то {нажать a}
если есть из. C && нет из. A && нет из. B
то {нажать c}
если есть из. В && есть из. A && нет из. С
то {нажать b,a}
если есть из. В && есть из. С && нет из. А
то {нажать b,с}
если есть из. А && есть из. С && нет из. В
то {нажать а,с}
если есть из. В && есть из. A && есть из. С
то {нажать а,b,с}
Я верно понял? Если так, то это делает только хуже, в плане точности.
С таймерами:
code (Отобразить)CODE:
таймер(0,1)
{
проверить A если есть - нажать
}
таймер(1,1)
{
проверить B если есть - нажать
}
таймер(2,1)
{
проверить C если есть - нажать
}
Kibor пишет: Когда наступает время срабатывания управление передается в блок таймера.
Таким образом, если таймер сработает, например тут:
CODE:keydown('q');
pause (v); //вот тут, не успев отпустить кнопку
keyup('q');
то все пойдет крахом.
Какие еще варианты? |
|
|
Kibor |
Отправлено: 02 Января, 2015 - 18:25:38
|
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
DeLiberate пишет: то все пойдет крахом.
ну а с многопоточностью не пойдет?
DeLiberate пишет: Если так, то это делает только хуже, в плане точности.
я не знаю что имеется в виду под точностью в данном случае.
ну зная точной задачи ничего не скажу тут |
|
|
DeLiberate |
Отправлено: 02 Января, 2015 - 18:36:29
|
Участник
Покинул форум
Сообщений всего: 63
Дата рег-ции: Янв. 2015
Репутация: 0
|
Kibor пишет: DeLiberate пишет: то все пойдет крахом.
ну а с многопоточностью не пойдет?
DeLiberate пишет: Если так, то это делает только хуже, в плане точности.
я не знаю что имеется в виду под точностью в данном случае.
ну зная точной задачи ничего не скажу тут
Тут проблема в чем: если тут сработает таймер,
CODE:keydown('q');
pause (v); //вот тут, не успев отпустить кнопку
keyup('q');
то будет выполнятся код таймера, а этот будет ждать.
Если выделить каждому таймеру свой поток - таких конфликтов не может быть.
Игра в ВК "Flash guitar hero"
скрипт ищет ноты, если находит - жмет.
всего пять нот, каждая может быть трех цветов - отсюда три проверки на ноту * на пять нот = 15 "findimage"
процессор грузит не сильно, но
если ноты идут быстро, то получается Цитата: если, например, в данный момент скрипт проверяет область 'B' и в этот же момент искомое изображение появится в области 'A' - кнопка 'а' не нажмется.; .
Вот и ищу оптимальный алгоритм работы.
(Добавление)
DeLiberate пишет: Kibor пишет: DeLiberate пишет: то все пойдет крахом.
ну а с многопоточностью не пойдет?
DeLiberate пишет: Если так, то это делает только хуже, в плане точности.
я не знаю что имеется в виду под точностью в данном случае.
ну зная точной задачи ничего не скажу тут
Тут проблема в чем: если тут сработает таймер,
CODE:keydown('q');
pause (v); //вот тут, не успев отпустить кнопку
keyup('q');
то будет выполнятся код таймера, а этот будет ждать.
Если выделить каждому таймеру свой поток - таких конфликтов не может быть.
Игра в ВК "Flash guitar hero"
скрипт ищет ноты, если находит - жмет.
всего пять нот, каждая может быть трех цветов - отсюда три проверки на ноту * на пять нот = 15 "findimage"
процессор грузит не сильно, но
если ноты идут быстро, то получается Цитата: если, например, в данный момент скрипт проверяет область 'B' и в этот же момент искомое изображение появится в области 'A' - кнопка 'а' не нажмется.; .
Вот и ищу оптимальный алгоритм работы.
Еще вопрос, про : какой тип переменной может принимать параметр "Процент_совпадений_достаточный_для_идентификации" в функции findimage |
|
|
Kibor |
Отправлено: 02 Января, 2015 - 18:51:06
|
Эксперт
Покинул форум
Сообщений всего: 8217
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
DeLiberate пишет: Тут проблема в чем: если тут сработает таймер,
CODE:
keydown('q');
pause (v); //вот тут, не успев отпустить кнопку
keyup('q');
то будет выполнятся код таймера, а этот будет ждать.
Если выделить каждому таймеру свой поток - таких конфликтов не может быть.
ну это обходится флагами.
CODE:int f1=0, f2=0, f3=0;
таймер(0,1)
{
if (f2==0 && f3==0)
{
if (рис a)
{
f1=1;
keydown('q');
pause (v);
keyup('q');
f1=0;
}
}
}
таймер(1,1)
{
if (f1==0 && f3==0)
{
if (рис b)
{
f2=1;
keydown('e');
pause (v);
keyup('e');
f2=0;
}
}
}
таймер(2,1)
{
............
}
иль простым key('e');
паузу в настро йках кибор установить.
короче суть в быстрой одновременной проверке?
тогда искать findimage по заранее сделанном скрине как(для просмотра ссылки Вам необходимо авторизоваться) (Добавление)
DeLiberate пишет: какой тип переменной может принимать параметр "Процент_совпадений_достаточный_для_идентификации" в функции findimage
int 0-100 |
|
|
DeLiberate |
Отправлено: 02 Января, 2015 - 19:04:08
|
Участник
Покинул форум
Сообщений всего: 63
Дата рег-ции: Янв. 2015
Репутация: 0
|
Kibor пишет:
ну это обходится флагами.
Спойлер (Отобразить)CODE:int f1=0, f2=0, f3=0;
таймер(0,1)
{
if (f2==0 && f3==0)
{
if (рис a)
{
f1=1;
keydown('q');
pause (v);
keyup('q');
f1=0;
}
}
}
таймер(1,1)
{
if (f1==0 && f3==0)
{
if (рис b)
{
f2=1;
keydown('e');
pause (v);
keyup('e');
f2=0;
}
}
}
таймер(2,1)
{
............
}
иль простым key('e' ;
паузу в настро йках кибор установить.
короче суть в быстрой одновременной проверке?
тогда искать findimage по заранее сделанном скрине как (для просмотра ссылки Вам необходимо авторизоваться) (Добавление)
int 0-100
Интересно, пошел пробовать screen. Спасибо! |
|
|
|