Junior |
Отправлено: 28 Мая, 2018 - 22:43:17
|
Прохожий
Покинул форум
Сообщений всего: 23
Дата рег-ции: Май 2018
Репутация: 0
|
Цитата: Вот снял короткое видео на котором показано как использовать фильтр динамики для этого.
Осваивайте инструментарий Кибор. Все это делается за минуты.
Я попробовал, проблема осталась, т.к. основная задача, не найти кнопку, а определить её состояние: вкл/выкл и если вкл, то выключить её, при том что кнопка полупрозрачная и фон меняется.
Появилась другая идея.
CODE:int getc1, getc2, gcol1, gcol2, fp1=0, dif1, ob1, obcol1[3];
int getc3, getc4, gcol3, gcol4, fp2=0, dif2, ob2, obcol2[3];
int time1, time2, time3, time4, rzb1=20, rzb2==20;
int x1=799, y1=607, x2=850, y2=607;
starting:
pause(100);
//ñìîòðèì êàêîé öâåò ôîíà
getc1=getcolor(x1,y1);//ñìîòðèì öâåò íà êíîïêå
ob1=getcolor(799,593);
obcol1[0]=rvalue(ob1);
obcol1[1]=gvalue(ob1);
obcol1[2]=bvalue(ob1);
if (obcol1[0]>70) {gcol1=bvalue(getc1);}
else {gcol1=gvalue(getc1);}
//ñìîòðèì êàêîé öâåò ôîíà
getc3=getcolor(x2,y2);
ob2=getcolor(850,593);
obcol2[0]=rvalue(ob2);
obcol2[2]=gvalue(ob2);
obcol2[1]=bvalue(ob2);
if (obcol2[0]>70) {gcol3=bvalue(getc3);}
else {gcol3=gvalue(getc3);}
time1=gettime();
time2=time1;
a: if (time2-time1<4000){time2=gettime();
getc2=getcolor(x1,y1);
if (obcol2[0]>70) {gcol2=bvalue(getc2);}
else {gcol2=gvalue(getc2);}
dif1=gcol2-gcol1;
if ((dif1>rzb1||dif1<-1*rzb1)&&dif1!=0)
{fp1=1;textout(6, 799, 728, format(dif1), 1);}
textout(1, x1, y1+1, format(fp1), 1);
textout(2, 799, 628, format(getc2), 1);
textout(3, 799, 688, format(gcol1), 1);
textout(5, 799, 708, format(gcol2), 1);
if (dif1>20) textout(50, 799, 788, format(dif1), 1);
if (dif1<20) textout(51, 799, 808, format(dif1), 1);
getc4=getcolor(x2,y2);
if (obcol2[0]>70) {gcol4=bvalue(getc4);}
else {gcol4=gvalue(getc4);}
dif2=gcol4-gcol3;
if ((dif2>rzb2||dif2<-1*rzb2)&&dif2!=0)
{fp2=1; textout(14, 850, 728, format(gcol4-gcol3), 1);}
textout(10, x2, y2+1, format(fp2), 1);
textout(11, 850, 628, format(getc4), 1);
textout(12, 850, 688, format(gcol3), 1);
textout(13, 850, 708, format(gcol4), 1);
pause(10);
goto a;
}
if (fp1==1)
{textout(7, 799, 550, "Migaet", 1); fp1=0;
//mousemove(x1, y1);
//pause(100); mouse(LEFT, x1, y1);pause(100); mousemove(x1, y1-80);
pause(100);}
else {textout(7, 799, 550, "Ne migaet", 1);}
if (fp2==1)
{textout(8, 850, 550, "Migaet", 1); fp2=0;
//mousemove(x2, y2);
//pause(100); mouse(LEFT, x2, y2);pause(100); mousemove(x2, y2-80);
pause(100);}
else {textout(8, 850, 550, "Ne migaet", 1);}
goto starting;
Свою задачу он выполняет, но есть момент, который меня просто вымораживает и я хочу его устранить.
Суть кода такая: запоминаем начальные состояния 2ух соседних кнопок(по 1му пикселу на кнопку), запускаем таймер и внутри него спамим и запоминаем гетколор для каждой кнопки(по очереди), затем получаем разницу полученного ранее и полученного внутри таймера, если разница превышает определённое значение, то кнопка мигает и выводим на дисплей "1", если разница = 0, то выводим "0". Как я уже сказал, механизм работает, но есть нюанс... почему то первая кнопка постоянно проседает, в том плане, что даже если она мигает у неё проскакивает периодически 0(в показаниях), при том, что разница не нулевая(чисто визуально, по бегающим цифрам ), а вот вторая кнопка работает идеально. даёт только "1", когда мигает и "0", когда выключена. Пробовал, менять положение камеры, чтобы цвет фона был другим, менял блоки кнопок местами, из второй кнопки(работает идеально) делал первую. Результат, один - в кнопку 1 проскакивает "0".
Помогите найти ошибку. |
|
|
Junior |
Отправлено: 30 Мая, 2018 - 03:50:05
|
Прохожий
Покинул форум
Сообщений всего: 23
Дата рег-ции: Май 2018
Репутация: 0
|
Zireael пишет:
Один знак = должен быть.
Что за игра?
EVE онлайн
Использовал постоянно pause, пока не узнал, что ещё есть sleep. Чем они отличаются, в каких случаях нужно каждую из них использовать? |
|
|
Zireael |
Отправлено: 31 Мая, 2018 - 12:38:42
|
Эксперт
Покинул форум
Сообщений всего: 4465
Дата рег-ции: Нояб. 2017
Репутация: 585
|
Цитата: EVE онлайн
https://drive.google.com/open?id...9ABN575G0FBZZ2WV
В архиве видео, как сделать картинку и как определить мигает кнопка или нет.
Код, который использовался (Отобразить)CODE:int Image_0[44][46];
loadimage (#Image_0[0][0], "C:\Program Files\Kibor\Image_0.bmp");
win w=window ("EVE - TopTop Vemane", "triuiScreen", -1);
int PosX, PosY;
int r=130; // разбежность
int cd=1000; // время, в течении которого, картинка должна быть постоянно найдена
// иначе считаеся что она мигает
int time;
loop()
{
time=gettime()+cd;
if(findimage(1, #Image_0[0][0], 0, #PosX, #PosY, 914, 896, 981, 948, r,r,r,r,r,r, 100, 1, w)>0) // если найдена
{
time=gettime()+cd;
// ждём в течении cd будет найдена картинка или нет
while(time>gettime() && findimage(1, #Image_0[0][0], 0, #PosX, #PosY, 914, 896, 981, 948, r,r,r,r,r,r, 100, 1, w)>0)
{
sleep(100);
}
sleep(10);
}
if(time > gettime()) // если картинка не была найдена в течении 1 секунды
{ // значит она мигает
textbkcolor(255, 65280);
textout(0, 600, 600, "Включено", 0);
}
else // иначе не мигает
{
textbkcolor(65280, 255);
textout(0, 600, 600, "Выключено", 0);
}
sleep(100);
}
Тут не проверяется есть ли вообще картинка на экране. Если надо добавляйте поиск с меньшей разбежностью. |
|
|
|