Автокликер Clickermann :: Форум
Основной раздел => Общие вопросы => Topic started by: Синичка on July 03, 2014, 09:38:27 PM
-
Здравствуйте.
Мне немного сложно объяснить своим обычным языком, так как термины не знаю, так что простите)
Во всём общем скрипте есть несколько повторяющихся моментов. Очень муторно искать эти "моменты" при малейших изменениях координат и все менять на новые.
Можно ли в самом начале прописать скрипт, задать ему имя, и чтобы эти повторяющиеся "моменты" просто обращались к этому с заданными параметрами скрипту по имени, выполняя то, что там прописано?
-
Конечно, для этого есть подпрограммы. Параметры тоже доступны.
// подпрограмма
SUB(поиск, $x1,$y1,$x2,$y2,$file)
GETSCREEN
IF_PICTURE_IN ($x1,$y1,$x2,$y2,$file, -1, 100)
LCLICK($_return1, $_return2)
WAITMS(100)
END_IF
END_SUB
// вызов подпрограммы (обязательно ниже подпрограммы)
поиск(100,100,300,300,"file1.bmp")
поиск(400,400,500,500,"file2.bmp")
поиск(300,300,400,400,"file3.bmp")
-
WAITMS(500)
sub(mysub)
for($i, $i<105)
LCLICK(329,267)
WAITMS(50)
LCLICK(804,564)
WAITMS(50)
LCLICK(230,850)
WAITMS(300)
LCLICK(376,866)
WAITMS(200)
end_cyc
end_sub
// вызов подпрограммы
mysub()
LCLICK(1092,334)
WAITMS(RND(1000,2000)) // Рандомная задержка 1000-2000 мс
Попробовала, работает, спасибо) теперь строк в коде еще меньше будет и затраты по времени на переделывание кода будет меньше. Можно таких подпрограмм в код любое количество запихнуть? Штук 5, например, а не одну
-
Да, главное чтобы у каждой подпрограммы было свое имя, они были выше вызова, и еще нельзя вкладывать подпрограмму в подпрограмму.
-
Всем привет :)
Сорри что не по теме пишу, просто "не вынесла душа поэта", а новую тему создавать нет смысла.
Запреты в написании скриптов на использование чего либо всегда есть, и правила хорошего тона тоже существуют.
Хочу выступить в защиту "богомерзкого" GOTO и по поводу "нельзя вкладывать подпрограмму в подпрограмму".
Вот мой рабочий скрипт для воина в World of Warcraft: Mists of Pandaria. Он не доделанный и не оптимизированный, но рабочий и достаточный для прокачки персонажа и чтобы попасть в на вершину рейтинга по нанесенному урону среди игроков на поле боя.
Это не бот, а ассистент для боя (или "выпрямитель рук"), от игрока требуется только подойти к цели на расстояние атаки и стоять лицом к противнику. Всё остальное скрипт сделает сам. Но не в этом в общем дело. Посмотрите на количество GOTO в скрипте и вложенные друг в друга подпрограммы. Там всего один GETSCREEN на весь сценарий.
Задача была такая, чтобы после выполнения каждого атакующего действия скрипт возвращался в начало сценария и проверял, не готово ли более высокое по приоритету действие. И, если готово, то выполнил именно его, так как оно будет самым правильным в данный момент боя. Можно ли как то написать по другому я не знаю, и надо ли всё усложнять? Читаемость скрипта по моему отличная, скорость выполнения даже избыточная. Структура скрипта пока простейшая.
1. Сделать снимок экрана.
2. Выбрать оптимальное (по приоритету) действие.
3. Выполнить это действие.
4. Вернуться в начало сценария (непосредственно после выполнения действия, не тратя время на оставшийся код).
Конечно я всё сделал не "по понятиям", но я рискнул и у меня получилось, чего и вам желаю. :)
Скрипт во вложении.
-
Зачем ты путаешь людей. Где в этом скрипте вложенные подпрограммы?
Тем более, что речь шла о вкладывании "тела" подпрограммы в "тело" другой, что не касается вызовов подпрограмм. Вызывать можешь сколь угодно глубоко и часто.
Про GETSCREEN... у тебя другая ситуация. И к скрипту выше не применима. Ты после каждого (почти) действия к GETSCREEN возвращаешься.
С GOTO можешь писать как тебе удобно если пока не умеешь по-другому. Ничего в этом страшного нет на этой стадии.
Без GOTO можно написать не менее красиво и не менее понятно, это дело привычки. Поймёшь когда логика работы понадобиться больше 4 шагов и очень ветвистая.
-
Я так понимаю вот подпрограммы вложенные одна в другую и это работает.
// Описание подпрограмм выше
SUB(Сбить_каст) // Сбить каст / Включить защиту от магии
IF( (PXL(430,792) = 204) | (PXL(391,793) = 204) ) // Если цель творит заклинание
SWITCH($distance)
CASE(786687) // Дистанция ближнего боя (до 5 метров)
Зуботычина()
Устрашающий_крик()
Разрушительный_крик()
Вихрь_клинков() // Ударная волна или Вихрь клинков готовы
Удар_громовержца()
CASE(63743) // Средняя дистанция (от 5 до 8 метров)
Устрашающий_крик()
Разрушительный_крик()
Вихрь_клинков() // Ударная волна или Вихрь клинков готовы
Удар_громовержца()
CASE(65284) // Дистанция Рывка (от 8 до 10 метров)
Рывок()
Разрушительный_крик()
Вихрь_клинков() // Ударная волна или Вихрь клинков готовы
Удар_громовержца()
CASE(16755200) // Дистанция дальнего боя (от 10 до 30 метров)
Рывок()
Удар_громовержца()
DEFAULT
//
END_SWITCH
END_IF
END_SUB
А вот как "не менее красиво" написать пример описанный в этой теме?
http://crapware.aidf.org/forum/index.php?topic=1273.msg5977
Я же признаю, что что накосячил сильно, но работает же. :)
-
В этом отрывке только одна подпрограмма SUB(Сбить_каст) остальное условие свитч и вызовы подпрограмм. Все написано верно.
-
Подскажите, пожалуйста, где-то была тема, как переместить определенное окно из всех открытых в нужные координаты. И даже с заданными шириной-высотой. Найти не могу, как это сделать? На данный момент такое необходимо с мазилой и калькулятором
-
Подскажите, пожалуйста, где-то была тема, как переместить определенное окно из всех открытых в нужные координаты. И даже с заданными шириной-высотой. Найти не могу, как это сделать? На данный момент такое необходимо с мазилой и калькулятором
WAITMS(500)
// Находим уникальный идентификатор окна Mozillы Firefox - HWND (Handle of Window, "Ручка окна"),
// представленный числом, и присваеваем его зачение переменной.
// Идентификатор ищется по заголовку окна, или части заголовка (в данном случае "Firefox").
$hwnd = WNDFIND("Firefox")
// Теперь делаем это окно активным (выносим его на передний план)
WNDSTATE ($hwnd, 1)
// Перемещаем окно в заданные координаты, в данном примере левый верхний угол окна
// окажется в координатах x=100 и y=150
WNDPOS ($hwnd, 100, 150)
// Устанавливаем нужный размер окна, для примера 750x500
WNDSIZE ($hwnd, 750, 500)
HALT
-
Я так понимаю вот подпрограммы вложенные одна в другую и это работает.
...
Ты различаешь саму подпрограмму и её вызов? Кажется не очень. Перечитай ещё раз о чём речь.
-
Возникла некоторая проблема.
Например, в скрипте вначале написано 3 подпрограмм друг за другом, названные Один,Два,Три для облегчения. после этого я вызываю подпрограмму "Два"
for($i, $i<15)
// вызов подпрограммы
Два()
END_CYC
а далее вызываю подпрограмму Один.
Проблема заключается в том, что после того, как сработала подпрограмма "Два", она не останавливается, даже если прописать i<1. Она работает бесконечно, так и не переходя никогда на что-то последующее. Ни на Один, ни на Три... Вообще не реагирует на то, что дальше.
Вот в это "for($i, $i<15)" нельзя получается что ли пихать вызов подпрограммы?
-
раньше была ошибка с циклами и подпрограммами в них, но в последней версии это вроде бы исправлено. Возможн оу тебя ошибка в коде.
-
// вызов подпрограммы
Один()
//Первая пачка
LCLICK(129,38)
WAITMS(2000)
LCLICK(81,88)
WAITMS(5000)
FOR ($i, $i<500) //\\\\\\\\\\\\\\\\\\\
// вызов подпрограммы
Два()
END_CYC
WAITMS(3000)
// вызов подпрограммы
Один()
Изменила названия) по отдельности вызовы работают, а вот друг за другом не хотят, в чем ошибка? Третий вызов, то есть самый последний, уже не срабатывает. Хотя даже если вместо него ставить просто клики мышкой по координатам, тоже не сработает. Глючит на втором вызове и работает бесконечно, даже если не 500 будет, а 1 цикл
-
Что находится в подпрограмме Два()
-
Только клики по координатам
sub(Два)
//Вход
LCLICK(801,506)
WAITMS(500)
LCLICK(15,601)
WAITMS(4000)
LCLICK(354,300)
WAITMS(1000)
end_sub
Потом то, что написала выше. Только в том, что выше, гораздо больше кликов, я просто укоротила. Ничего лишнего, только клики левой кнопкой мыши и задержки. По отдельности все работает отлично, проблема заключается лишь в
FOR ($i, $i<500) //\\\\\\\\\\\\\\\\\\\
// вызов подпрограммы
Два()
END_CYC
Так как на этом моменте глючит и не идет дальше. Как можно заменить, чтобы не глючило?
-
Версия кликера последняя 4.10 ?
У меня по крайней мере подпрограмма в цикле отрабатывает корректно.
-
Попробуйте, для наглядности, вывести в лог работу скрипта. Вот такой скрипт будет работать?
WAITMS(500)
//-------------------------------- Описание подпрограмм
SUB(Один)
LOGWRITE ("Один")
LOGWRITE ("-----")
WAITMS(500)
END_SUB
SUB(Два)
LOGWRITE ("Два")
WAITMS(500)
END_SUB
SUB(Три)
LOGWRITE ("Три")
WAITMS(1500)
END_SUB
//-------------------------------- Сценарий
start:
LOGCLEAR // Очистить окно журнала
LOGSHOW(1) // Показать окно журнала
WAITMS(1000)
Один() // Вызов подпрограммы "Один"
FOR ($i, $i<5)
Два() // Вызов подпрограммы "Два"
END_CYC
LOGWRITE ("-----")
WAITMS(500)
Три() // Вызов подпрограммы "Три"
//--------------------------------
GOTO(start) // Возврат в начало сценария (описание подпрограмм повторно не перечитываем)
Если все подпрограммы работают нормально, в логе должно получиться:
11:11:44 Один
11:11:44 -----
11:11:44 Два
11:11:45 Два
11:11:45 Два
11:11:46 Два
11:11:46 Два
11:11:47 -----
11:11:47 Три
-
мм.. нет, у меня получилось
2:23:28 Один
2:23:28 -----
2:23:28 Два
2:23:29 Два
2:23:29 Два
2:23:30 Два
2:23:30 Два
2:23:31 Два
2:23:31 Два
2:23:32 Два
2:23:32 Два
2:23:33 Два
2:23:33 Два
2:23:34 Два
2:23:34 Два
2:23:35 Два
2:23:35 Два
ну и так до бесконечности
P.S. Перекачала версию, получилось так же, как и у вас. Чуть позже проверю, будет ли работать тогда мой вариант. Да, у меня версия была чуть ранняя получается.. Не слежу за этим
P.P.S. Всё работает теперь, вопрос снят. Спасибо огромное) тут моя ошибка, не скачивала обновление.
Возник другой вопрос:
Я в конце скрипта вставляла
SOUND ("1.wav")
чтобы проигрывался звуковой файл. Возникла проблема - если файл очень большой, то надо мне вручную через некоторое время отключить работу скрипта, чтобы файл перестал работать. Но кликерман не выключается, пока не отработает весь файл, приходилось выключать звук на компьютере и ждать, либо через диспетчер закрывать. Как выключить работу кликермана при звуковом файле? Постоянно закрывать и открывать кликерман не хочется... Я резала файл, но бывает, что этого времени не хватает, а бывает наоборот, много. А как выключить, не знаю, ведь никаких звуковых дорожек не открывается, плюс к тому перед запуском скрипта приходится настраивать громкость на компьютере, потому что звуковой файл включается на полную..