Автокликер Clickermann :: Форум
Основной раздел => Использование => Topic started by: Cryolama on May 03, 2017, 01:52:27 PM
-
Я не особо соображаю, так что не ругайтесь на меня. Суть вопроса такая.
1. Изначально есть определенный пиксель зеленого цвета. И скрипт при виде этого пикселя (зеленый) выполняет команду, выставляя значение 1 в поле и жмет enter, это действие циклично и бесконечно повторяется с WAITMS, в случае если нет изменений.
2. Если пиксель стал красным, то он выставляет значение 3 и жмет enter.
И тут у меня камень преткновения. Как сделать так, чтобы в случае повтора красного он выставил 9, а потом если повторится 30, и если будет снова красный - запустил скрипт с самого начала.
При этом если серия красных пикселей прерывается - так же возвращался на исходную и запускал скрипт с самого начала.
Спасибо если поясните хотя бы основные принципы.
-
Примерно так должно быть. Проверяйте на своих координатах. И коды красного и зеленого цветов свои поставьте.
Должно работать (я не проверял).
WAITMS(500) // дабы успеть отпрянуть от компа, чтобы не мешать скрипту работать :)
WHILE(1) // бесконечный цикл
GETSCREEN
WHILE(PXL(10,10) ! 65280) // проверяем появление зеленого пикселя в координатах (10,10), с частотой 50ms
WAITMS(50)
GETSCREEN
END_CYC
LOGWRITE ("Появился зеленый пиксель")
WHILE(PXL(10,10) = 65280) // выполняем действие "1", пока не погаснет зеленый пиксель
LOGWRITE ("Значение: 1")
// Ваше действие 1
WAITMS(500)
GETSCREEN
END_CYC
LOGWRITE ("Пиксель больше не зеленый. Уж не красный ли?)") // иначе - в начало сценария
WHILE( (PXL(10,10) = 255) & ($red < 4) ) // выполняем действие 2, 3 и 4, поочередно, если пиксель красный, всего - не более 3 действий
INC($red) // наращиваем переменную-счетчик (на единицу за проход)
SWITCH($red) // выбираем действие в зависимости от значения сетчика
CASE(1)
LOGWRITE ("Значение: 3")
// Ваше действие 2
WAITMS(500) // персональная задержка после действия 2
GETSCREEN
CASE(2)
LOGWRITE ("Значение: 9")
// Ваше действие 3
WAITMS(RND(350,555)) // персональная (рандомная) задержка после действия 3
GETSCREEN
CASE(3)
LOGWRITE ("Значение: 30")
// Ваше действие 4 (последнее из возможных)
// четвертого варианта, для красного пикселя, не дано; теперь все действия выполнены...
UNDEFINE($red) // очищаем переменную, для последующего использования
// выходим из цикла по условию ($red < 4) и возвращаемся в начало сценария
DEFAULT
END_SWITCH
END_CYC
END_CYC
-
Зачем вы все постоянно пишите DEFAULT? Это не обязательная часть, как ELSE в условии.
-
Не забываем, что я лошара и скрипты никогда не писал.
Это мое творчество вполне себе работает, теперь буду переписывать как посоветовали. И есть один нюанс.
Как сделать так, чтобы после 4-5-6 и последующих красных пикселях подряд, он выставлял только "1" до того момента, пока снова не встретится зеленый пиксель и вновь запускал скрипт с самого начала?
skip:
WAIT(1)
GETSCREEN(673,684, 696,694)// вариант №1
IF(PXL(682,690) = 7831869) // пошло по сценарию
KEYPRESS(#BACKSPACE)
KEYPRESS(#BACKSPACE)// дважды чтобы не париться с двухзначным числом
WAITMS(5)
KEYSTRING("1") // вписал
WAITMS(5)
KEYPRESS(#SPACE) // исполнение команды
WAIT(1)
GOTO(skip) // успешно, значит начинаем сначала
ELSE // пошло не по сценарию
KEYPRESS(#BACKSPACE)
KEYPRESS(#BACKSPACE)
KEYSTRING("3") // вписал
KEYPRESS(#SPACE) // исполнение команды
SOUND("play.wav") // уведомил, что пошло не так
END_IF
WAIT(5)
GETSCREEN(673,684, 696,694)// вариант №2
IF(PXL(682,690) = 7831869) // пошло по сценарию
KEYPRESS(#BACKSPACE)
KEYPRESS(#BACKSPACE)
KEYSTRING("1") // вписал
KEYPRESS(#SPACE) // исполнение команды
WAITMS(100)
GOTO(skip) // успешно, значит начинаем сначала
ELSE // пошло не по сценарию
KEYPRESS(#BACKSPACE)
KEYPRESS(#BACKSPACE)
KEYSTRING("9") // вписал
KEYPRESS(#SPACE) // исполнение команды
END_IF
WAIT(1)
GETSCREEN(673,684, 696,694)// вариант №2
IF(PXL(682,690) = 7831869) // пошло по сценарию
KEYPRESS(#BACKSPACE)
KEYPRESS(#BACKSPACE)
KEYSTRING("1") // вписал
KEYPRESS(#SPACE) // исполнение команды
WAITMS(100)
GOTO(skip) // успешно, значит начинаем сначала
ELSE // пошло не по сценарию
KEYPRESS(#BACKSPACE)
KEYPRESS(#BACKSPACE)
KEYSTRING("30") // вписал
KEYPRESS(#SPACE) // исполнение команды
END_IF
WAIT(1) // ну и 4 варианта не дано, пошли по новой
-
Зачем вы все постоянно пишите DEFAULT? Это не обязательная часть, как ELSE в условии.
Спасибо за подсказку, я не знал, что можно писать без DEFAULT. В Справке, про DEFAULT в SWITCH упоминается только это..
Часть default (по умолчанию) используется для всех остальных неописанных случаев. Она должа быть описана последней.
Вообще, я ожидал, что полетят тапки... вот только в другое место. :) В строке 22 моей писанины, было бы уместнее использовать цикл FOR, вместо WHILE и изавиться от INC($red) в строке 24 и от UNDEFINE($red) в строке 41. Но думаю так даже лучше - из обсуждения криво написанного скрипта можно узнать больше интересных вариантов, чем из почти идеального готового решения, тоторых здесь много и которые как бэ даже не обсуждаются.
Теперь, что касается самого SWITCH'а - главная беда в том, что в этом сценарии, он вообще ненужен (как с DEFAULT, так и без него). Тут же не условие, а тупой безусловный перебор значений массива. Тяжкий грех, каюсь. :-[
Короче, как обычно, поторопился я, зато хоть что-то успел написать. :)
-
Как сделать так, чтобы после 4-5-6 и последующих красных пикселях подряд, он выставлял только "1" до того
момента, пока снова не встретится зеленый пиксель и вновь запускал скрипт с самого начала?
Пробуйте так, со своими значениями цвета и координат (написал как понял задачу, не проверял, нет времени). Результаты см. в логе.
WAITMS(500)
STRSEPARATE("3:9:30", ":", $arr)
GETSCREEN
WHILE(1)
FOR($n = 0, ($n < 3) & (PXL(10,10) = 255) ) // только 3 действия и только когда горит красный
LOGWRITE ($arr[$n])
// Ваше действие, в зависимости от значения переменной-сетчика $arr[$n]
WAITMS(500)
GETSCREEN
END_CYC
LOGWRITE ("1") // всегда, когда нет красного
// Ваше действие по умолчанию
WAITMS(500)
GETSCREEN
END_CYC
-
Короче говоря, вроде разобрался, работает очень хорошо. Задержки обусловлены скоростью загрузки пикселей, значения так же поменял подстраиваясь под условия задачи. Все чётенько, работает. Для меня это самое главное. Спасибо большое за помощь!
WAIT(1)
STRSEPARATE("1:3:10", ":", $arr)
GETSCREEN(673,684, 696,694)
WHILE(1)
FOR($n = 0, ($n < 3) & (PXL(682,690) = 6440571) ) // только 3 действия и только когда горит красный
KEYPRESS(#BACKSPACE)
KEYPRESS(#BACKSPACE)
WAIT(1)
KEYSTRING($arr[$n]) // вписал
KEYPRESS(#SPACE) // выполнение
LOGWRITE($arr[$n])
// Ваше действие, в зависимости от значения переменной-сетчика $arr[$n]
WAIT(1)
GETSCREEN(673,684, 696,694)
END_CYC
LOGWRITE ("1") // всегда, когда нет красного
KEYPRESS(#BACKSPACE)
KEYPRESS(#BACKSPACE)
WAIT(2)
KEYSTRING("1") // вписал
KEYPRESS(#SPACE)// выполнение
WAIT(1)
GETSCREEN
END_CYC