Автокликер Clickermann :: Форум
Основной раздел => Общие вопросы => Topic started by: Jet on April 23, 2021, 11:20:57 AM
-
Есть скрипт, он выполняет пошагово задания в игре, которые идут строго по порядку и элементы на экране появляються строго в определенной области. Ищу картинку/пиксел-кликаю по нему-жду пока пропадет-иду дальше и так по кругу.
Суть скрипта заключается:
1. Ожидает изображение с таймером
2. Если не нашел изображение с таймером - шаг назад к пункту 3 предыдущего такого-же сценария.
2.1 Снова ищу изображение/пиксель с таймером (если не нашел)
3. Если нашел - клик по нему ПОКА не исчезнет в установленное время
Как вижу это я:
Первое действие:
//
///Mission2
//
//
//
//
///Ожидаю пиксель
WHILE($time > $_time_t)
GETSCREEN (817,586,950,623)
COLORMODE (8)
IF_PICTURE_IN (817,586,950,623, "screens\Mission1.bmp", -1, 100)
$time = 0
print(Распознал_Mission1)
WAITMS(100)
END_IF
waitms(100)
END_CYC
//
//
//
//
///Если не распознал
IF($time ! 0)
//Ожидаю предыдущее исчезновение пикселя
print(Не_распознал_Mission1)
$time = $_time_t + 10
WHILE($time > $_time_t)
GETSCREEN (990,217,1006,272)
IF_PIXEL_IN (990,217,1006,272, 16053655)
print(Действую_Mission0)
waitms(300)
LCLICK($_return1, $_return2+10)
waitms(500)
ELSE
$time = 0
waitms(100)
print(Дальше)
END_IF
END_CYC
//
//
//
//
///Снова ищу картинку
$time = $_time_t + 90
WHILE($time > $_time_t)
GETSCREEN (817,586,950,623)
COLORMODE (8)
IF_PICTURE_IN (817,586,950,623, "screens\Mission1.bmp", -1, 100)
$time = 0
print(Распознал_Mission1)
WAITMS(100)
END_IF
waitms(100)
END_CYC
END_IF
//
//
//
//
///Ожидаю исчезновения картинки после нажатия на нее
$time = $_time_t + 10
WHILE($time > $_time_t)
GETSCREEN (817,586,950,623)
COLORMODE (8)
IF_PICTURE_IN (817,586,950,623, "screens\Mission1.bmp", -1, 100)
print(Действую_Mission1)
waitms(300)
LCLICK($_return1, $_return2)
waitms(500)
ELSE
$time = 0
waitms(100)
print(Дальше)
END_IF
END_CYC
IF($time > 0)
print(Время_ожидания_исчерпано_Mission1)
END_IF
Второе дейстиве:
//
///Mission2
//
//
//
///Ожидаю пиксель
$time = $_time_t + 240
WHILE($time > $_time_t)
GETSCREEN (400,585,581,623)
IF_PIXEL_IN (400,585,581,623, 10538475)
$time = 0
print(Распознал_Mission2)
WAITMS(100)
END_IF
waitms(100)
END_CYC
//
//
//
///Если не распознал
IF($time ! 0)
///Ожидаю предыдущее исчезновение картинки
print(Не распознал_Mission2)
$time = $_time_t + 10
WHILE($time > $_time_t)
print(Возвращаюсь_на_шаг_назад)
GETSCREEN (817,586,950,623)
IF_PIXEL_IN (817,586,950,623, 11197951)
print(Действую_Mission1)
waitms(300)
LCLICK($_return1, $_return2+10)
waitms(500)
ELSE
$time = 0
waitms(100)
print(Дальше)
END_IF
END_CYC
//
//
//
//
///Снова ищу пиксель
$time = $_time_t + 190
WHILE($time > $_time_t)
GETSCREEN (400,585,581,623)
IF_PIXEL_IN (400,585,581,623, 10538475)
$time = 0
print(Распознал_Mission2)
WAITMS(100)
END_IF
waitms(100)
END_CYC
END_IF
//
//
//
//
//
///Ожидаю исчезновения картинки после нажатия на нее
$time = $_time_t + 10
WHILE($time > $_time_t)
GETSCREEN (400,585,581,623)
IF_PIXEL_IN (400,585,581,623, 10538475)
print(Действую_Mission2)
waitms(300)
LCLICK($_return1, $_return2+10)
waitms(500)
ELSE
$time = 0
waitms(100)
print(Дальше)
END_IF
END_CYC
IF($time > 0)
print(Время_ожидания_исчерпано_Mission2)
END_IF
Каждое вот такое действие я пишу в отдельном файле и вызываю через #include в основном файле - суть которого заключается тупо распаковать чтобы не захламлять.
Например:
#include "steps\Mission1.cms"
waitms(3500)
#include "steps\Mission2.cms"
waitms(3500)
и так далее.Таких действий инклюдов в основном файле сотни лежат поочереди
Вобщем,правильно ли это дело написано,есть ли способ улучшить это,упростить как-то итд
Можно ли пользоваться Include в таких количествах (у меня их примерно 300-350шт)
не замедляет ли он весь скрипт?
После этих пошаговых действий идут рандомные события на которые я должен реагировать:
1. Кликаю на картинку/пиксель и после него может появиться одна из 3 разных картинок в разных координатах одновременно
2. нужно чтобы скрипт их искал с таймером, и предпринимал разные действия к разным картинкам исходя из того какую нашел
3. действия должны быть такие как в первом скрипте (жду элемент с таймером-кликаю на него пока не пропадет-если не нашел делай шаг назад - иду дальше)
Я знаю, что это делается примерно так,через Else:
//
//
//
///BLITZ2_Stamina
//
//
$time = $_time_t + 15
print(Ожидаю_BLITZ2_Stamina)
WHILE($time > $_time_t)
GETSCREEN (400,72,939,451)
COLORMODE(7)//BLITZ 2
IF_PICTURE_IN (574,110,791,138, "screens\blitz2.bmp", -1, 100)
$time = 0
print(Захожу_Blitz2)
waitms(100)
END_IF
ELSE //Stamina
IF_PIXEL_IN (408,314,939,451, 2281723 )
$time = 0
WAITMS(100)
print(Действую_Stamina)
waitms(300)
LCLICK(687,525) // 3422304
waitms(1500)
LCLICK(1141,97) // 4950978
waitms(100)
END_IF
ELSE //PVP
IF_PIXEL_IN (108,314,339,651, 1282723 )
$time = 0
WAITMS(100)
print(Действую_PVP)
waitms(300)
LCLICK(687,525) // 3422304
waitms(1500)
LCLICK(1141,97) // 4950978
waitms(100)
END_IF
END_CYC
Но когда я после ифов елсов пишу еще свои ифы елсы циклы итд - оно все не работает:(
Короче,я хочу вставить код(примерно такую логику действий) в Елсы как в первом скрипте.Мне не достаточно простых процедур т.к. нужно еще чтобы проверяло исчезновение картинки с таймером и так далее.
Буду безумно благодарен любой помощи,любому совету.
-
Вобщем,правильно ли это дело написано,есть ли способ улучшить это,упростить как-то итд
Способ улучшить есть почти всегда. Используй подпрограммы.
Непонятна роль куска в районе строк 46-58. Он лишний. Дальше идёт этот же поиск опять.
Можно ли пользоваться Include в таких количествах (у меня их примерно 300-350шт)
не замедляет ли он весь скрипт?
Можно. Работу не замедляет. Может будет чуть дольше старт.
Дальше порядок действий непонятен, но код неправильный в любом случае.
Но когда я после ифов елсов пишу еще свои ифы елсы циклы итд - оно все не работает:(
Естественно. У блока WHILE не может быть своих ELSE. У тебя получается если посмотреть в упрощённом виде
WHILE($time > $_time_t)
IF_PICTURE_IN (574,110,791,138, "screens\blitz2.bmp", -1, 100)
END_IF
ELSE //Stamina
IF_PIXEL_IN (408,314,939,451, 2281723 )
END_IF
ELSE //PVP
IF_PIXEL_IN (108,314,339,651, 1282723 )
END_IF
END_CYC
ELSE бывают только в блоках IF и только по 1 штуке. Всё остальное делается вложенностью.
Мне не достаточно простых процедур т.к. нужно еще чтобы проверяло исчезновение картинки с таймером и так далее.
И почему здесь недостаточно процедур?
появиться одна из 3 разных картинок в разных координатах одновременно
Чтобы правильно написать этот кусок, нужно понимать что нужно. Код совсем не соответствует описанию, в нём нет поиска 3 картинок нив каком порядке.
Все вот эти "Кликаю на картинку/пиксель" "действия к разным картинкам" и прочие общие слова ясности не добавляют. Нужно писать конкретно с привязкой к показанному коду.
Например: ищем картинку P1.bmp, должна обязательно/необязательно появится одна из/одна или несколько сразу - P10.bmp, P20.bmp, P30.bmp
Нужно ждать пока появятся - все сразу/все по очереди/хотя бы одна и т.д. Что делаем после того как появилась. Что делать если не появилась.
-
300-350 инклудов, чтобы не захламлять? Серьёзно? А если строго определённые координаты элементов сместятся, что тогда? Это какой-то собственно ручный ад. :D
-
Если есть одинаковые куски по последовательности - выноси в подпрограммы. Типа такого
SUB(search_pic, $sp_x1, $sp_y1, $sp_x2, $sp_y2, $sp_pic, $sp_mode)
$time = $_time_t + 10
WHILE($time > $_time_t)
GETSCREEN($sp_x1, $sp_y1, $sp_x2, $sp_y2)
COLORMODE(8, $sp_x1, $sp_y1, $sp_x2, $sp_y2)
IF_PICTURE_IN($sp_x1, $sp_y1, $sp_x2, $sp_y2, STRCONCAT("screens\", $sp_pic, ".bmp"))
IF($sp_mode = 1)
$time = 0
print("Распознал_", $sp_pic)
ELSE
print("Действую_", $sp_pic)
LCLICK($_return1, $_return2)
waitms(500)
END_IF
ELSE
IF($sp_mode = 1)
ELSE
$time = 0
print("Дальше")
END_IF
END_IF
waitms(100)
END_CYC
END_SUB
//
///Mission2
//
search_pic(817,586,950,623, "Mission1", 1) // 1 - режим ожидает появления
// Если не распознал
IF($time ! 0)
//Ожидаю предыдущее исчезновение пикселя
print("Не_распознал_Mission1")
$time = $_time_t + 10
WHILE($time > $_time_t)
GETSCREEN (990,217,1006,272)
IF_PIXEL_IN (990,217,1006,272, 16053655)
print("Действую_Mission0")
waitms(300)
LCLICK($_return1, $_return2+10)
waitms(500)
ELSE
$time = 0
waitms(100)
print("Дальше")
END_IF
END_CYC
END_IF
///Ожидаю исчезновения картинки после нажатия на нее
search_pic(817,586,950,623, "Mission1", 2) // 2 - режим ожидает пропадания
IF($time > 0)
print("Время_ожидания_исчерпано_Mission1")
END_IF
Если вся последовательность повторяется несколько раз, можно её оформить в подпрограмму уровнем выше. Или переделать существующую в более плоский вид.
Непонятно что делаем если не нашлось за установленное время. Неужели просто оповещение.
Ну и да, с координатами областей можно что-то сделать. Ведь там наверняка одни и те же зоны для подобных действий. Таких зон 5-10, да неважно сколько. Можно задать переменным, тогда можно всё ещё сильнее укоротить.
-
Непонятна роль куска в районе строк 46-58. Он лишний. Дальше идёт этот же поиск опять.
Да, (я тогда не знал про GOTO) но только тогда, когда условие ложно - сперва он ищет предыдущий пиксель/картинку,который был еще в предыдущем include'e - действует с ним - снова ищет текущий пиксель в текущем скрипте(include'e)
появиться одна из 3 разных картинок в разных координатах одновременно
Чтобы правильно написать этот кусок, нужно понимать что нужно. Код совсем не соответствует описанию, в нём нет поиска 3 картинок нив каком порядке.
Все вот эти "Кликаю на картинку/пиксель" "действия к разным картинкам" и прочие общие слова ясности не добавляют. Нужно писать конкретно с привязкой к показанному коду.
Например: ищем картинку P1.bmp, должна обязательно/необязательно появится одна из/одна или несколько сразу - P10.bmp, P20.bmp, P30.bmp
Нужно ждать пока появятся - все сразу/все по очереди/хотя бы одна и т.д. Что делаем после того как появилась. Что делать если не появилась.
Ищем картинку с таймером P1.bmp, должна обязательно появится одна из P1.bmp, P2.bmp, P3.bmp, P4.bmp сразу.
Нужно ждать пока появятся - хотя бы одна. После того как появилась делаем клик по картинке (Р1 - клик 10 раз, к Р2-Р4 это не применяется) и ожидаем исчезновение. Если не появилась - возвращение к предыдущему такому же условию которое вызвало картинку Р1.
Грубо говоря если нашел Р1 выполнил действия, то все ок - иди дальше к следующим include'ам искать картинки по списку. Если нашел Р2-Р4 - то ищи картинки еще в этом условии с таймерами на появление и исчезновение.
Насколько я понял это можно реализовать через подпрограммы вызывая их.
Почему мне не подходят обычные процедуры для каждой отдельной картинки? - потому что мне нужно ожидать картинку и ожидать исчезновения. После Else'a уже находясь в цикле я не могу его вызвать снова пока он не закончится и я не выйду с условия.
Для общей картины обьясню, что вообще происходит. Я нажимаю на кнопку которая повышает мой лвл(Р1) - когда я делаю это, может произойти 1 из 3 событий, из-за которых выскакивает новое окно: (Р2)недостаточно энергии, (Р3)недостаточно талонов, (Р4)новый уровень.
Соответственно когда мне выскакивает 1 из 3 окон я должен нажать на него и еще понажимать несколько картинок после него чтобы вернуться к Р1 и продолжить сценарий.
Вроде так, если нашел Р2-Р4 - кликаю на него и делаю другие действия (sub), ищу следующие картинки еще в этом условии и потом выхожу из него и иду дальше по сценарию по include'ам.
Как в одной подпрограмме искать несколько картинок поочереди например 5 раз путем повышения числа переменной $action_pic.
И если не нашел например вторую (pvp2) картинку - возвращалось на предыдущую (pvp1) - в конце повышения числа должно искать pvp5.bmp
Если не нашел первую (pvp1) - возвращайся к условию которое вызвало подпрограмму 63 строка(тоесть это уже выход из программы,если такое возможно)
Пример для понимания:
SUB(action1, $sp_x1, $sp_y1, $sp_x2, $sp_y2, $action1_pic,$action_mode)
//====================// Координаты PVP
$sp_x1 = 902
$sp_y1 = 98
$sp_x2 = 923
$sp_y2 = 147
//====================
//====================// Название картинки - "pvp1"
$action1_pic = pvp1
//====================
$time = $_time_t + 10
WHILE($time > $_time_t)
GETSCREEN($sp_x1, $sp_y1, $sp_x2, $sp_y2)
COLORMODE(7, $sp_x1, $sp_y1, $sp_x2, $sp_y2)
IF_PICTURE_IN($sp_x1, $sp_y1, $sp_x2, $sp_y2, STRCONCAT("screens\", $action1_pic, ".bmp"))
IF($action_mode = 1)
$time = 0
print("Распознал_", $action1_pic)
ELSE
print("Действую_", $action1_pic)
LCLICK($_return1, $_return2)
waitms(500)
END_IF
ELSE
IF($action_mode = 1)
ELSE
$time = 0
print("Дальше")
END_IF
END_IF
waitms(100)
END_CYC
IF($time ! 0)
print("Не_распознал")
//И если не нашел например вторую (pvp2) картинку - возвращалось на предыдущую (pvp1)
END_IF
END_SUB
FOR ($i, $i<10)// кликнуть 10 раз на Р1
$time = $_time_t + 10 // таймер на 10 секунд
WHILE($time > $_time_t)
GETSCREEN
COLORMODE (7)
IF_PICTURE_IN (0,0,100,200, $_xmax,$_ymax, "screens\P1.bmp", -1, 100)
$time = 0
LCLICK($_return1, $_return2)
WAITMS(100)
END_CYC
ELSE
IF_PICTURE_IN (902,98,923,147, "screens\P2.bmp", -1, 100)
$time = 0
LCLICK($_return1, $_return2)
//вызываю подпрограмму чтобы выполнить действия
action1($sp_x1, $sp_y1, $sp_x2, $sp_y2, $action1_pic, 1)
action1($sp_x1, $sp_y1, $sp_x2, $sp_y2, $action1_pic, 2)
// и так далее вызывать
ELSE
IF_PICTURE_IN (750,230,910,300, $_xmax,$_ymax, "screens\P3.bmp", -1, 100)
$time = 0
LCLICK($_return1, $_return2)
//вызываю подпрограмму чтобы выполнить действия
action2()
// и так далее вызывать
ELSE
IF_PICTURE_IN (470,560,610,650, "screens\P4.bmp", -1, 100)
$time = 0
LCLICK($_return1, $_return2)
//вызываю подпрограмму чтобы выполнить действия
action3()
// и так далее вызывать
END_IF
END_IF
END_IF
END_IF
END_CYC
IF($time ! 0)
// время истекло, ни одна из картинок не найдена
END_IF