Автокликер Clickermann :: Форум

Основной раздел => Общие вопросы => Topic started by: Синичка on July 03, 2014, 09:38:27 PM

Title: Обращение к скрипту по имени
Post by: Синичка on July 03, 2014, 09:38:27 PM
Здравствуйте.

Мне немного сложно объяснить своим обычным языком, так как термины не знаю, так что простите)
Во всём общем скрипте есть несколько повторяющихся моментов. Очень муторно искать эти "моменты" при малейших изменениях координат и все менять на новые.
Можно ли в самом начале прописать скрипт, задать ему имя, и чтобы эти повторяющиеся "моменты" просто обращались к этому с заданными параметрами скрипту по имени, выполняя то, что там прописано?
Title: Re: Обращение к скрипту по имени
Post by: Oraven on July 04, 2014, 01:11:54 AM
Конечно, для этого есть подпрограммы. Параметры тоже доступны.

Code: (clickermann) [Select]
// подпрограмма
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")
Title: Re: Обращение к скрипту по имени
Post by: Синичка on July 04, 2014, 04:03:34 AM
Code: [Select]
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, например, а не одну
Title: Re: Обращение к скрипту по имени
Post by: Oraven on July 04, 2014, 11:17:42 AM
Да, главное чтобы у каждой подпрограммы было свое имя, они были выше вызова, и еще нельзя вкладывать подпрограмму в подпрограмму.
Title: Re: Обращение к скрипту по имени
Post by: Atas on July 04, 2014, 08:50:41 PM
Всем привет :)
Сорри что не по теме пишу, просто "не вынесла душа поэта", а новую тему создавать нет смысла.
Запреты в написании скриптов на использование чего либо всегда есть, и правила хорошего тона тоже существуют.
Хочу выступить в защиту "богомерзкого" GOTO и по поводу "нельзя вкладывать подпрограмму в подпрограмму".
Вот мой рабочий скрипт для воина в World of Warcraft: Mists of Pandaria. Он не доделанный и не оптимизированный, но рабочий и достаточный для прокачки персонажа и чтобы попасть в на вершину рейтинга по нанесенному урону среди игроков на поле боя.
Это не бот, а ассистент для боя (или "выпрямитель рук"), от игрока требуется только подойти к цели на расстояние атаки и стоять лицом к противнику. Всё остальное скрипт сделает сам. Но не в этом в общем дело. Посмотрите на количество GOTO в скрипте и вложенные друг в друга подпрограммы. Там всего один GETSCREEN на весь сценарий.
Задача была такая, чтобы после выполнения каждого атакующего действия скрипт возвращался в начало сценария и проверял, не готово ли более высокое по приоритету действие. И, если готово, то выполнил именно его, так как оно будет самым правильным в данный момент боя. Можно ли как то написать по другому я не знаю, и надо ли всё усложнять? Читаемость скрипта по моему отличная, скорость выполнения даже избыточная. Структура скрипта пока простейшая.

1. Сделать снимок экрана.
2. Выбрать оптимальное (по приоритету) действие.
3. Выполнить это действие.
4. Вернуться в начало сценария (непосредственно после выполнения действия, не тратя время на оставшийся код).

Конечно я всё сделал не "по понятиям", но я рискнул и у меня получилось, чего и вам желаю. :)
Скрипт во вложении.
Title: Re: Обращение к скрипту по имени
Post by: Vint on July 04, 2014, 09:42:24 PM
Зачем ты путаешь людей. Где в этом скрипте вложенные подпрограммы?
Тем более, что речь шла о вкладывании "тела" подпрограммы в "тело" другой, что не касается вызовов подпрограмм. Вызывать можешь сколь угодно глубоко и часто.

Про GETSCREEN... у тебя другая ситуация. И к скрипту выше не применима. Ты после каждого (почти) действия к GETSCREEN возвращаешься.


С GOTO можешь писать как тебе удобно если пока не умеешь по-другому. Ничего в этом страшного нет на этой стадии.
Без GOTO можно написать не менее красиво и не менее понятно, это дело привычки. Поймёшь когда логика работы понадобиться больше 4 шагов и очень ветвистая.
Title: Re: Обращение к скрипту по имени
Post by: Atas on July 04, 2014, 10:24:17 PM
Я так понимаю вот подпрограммы вложенные одна в другую и это работает.
Code: (clickermann) [Select]
// Описание подпрограмм выше
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

Я же признаю, что что накосячил сильно, но работает же. :)
Title: Re: Обращение к скрипту по имени
Post by: Oraven on July 04, 2014, 11:40:01 PM
В этом отрывке только одна подпрограмма SUB(Сбить_каст) остальное условие свитч и вызовы подпрограмм. Все написано верно.

Title: Re: Обращение к скрипту по имени
Post by: Синичка on July 05, 2014, 02:21:50 AM
Подскажите, пожалуйста, где-то была тема, как переместить определенное окно из всех открытых в нужные координаты. И даже с заданными шириной-высотой. Найти не могу, как это сделать? На данный момент такое необходимо с мазилой и калькулятором
Title: Re: Обращение к скрипту по имени
Post by: Atas on July 05, 2014, 12:25:15 PM
Подскажите, пожалуйста, где-то была тема, как переместить определенное окно из всех открытых в нужные координаты. И даже с заданными шириной-высотой. Найти не могу, как это сделать? На данный момент такое необходимо с мазилой и калькулятором
Code: (clickermann) [Select]
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
Title: Re: Обращение к скрипту по имени
Post by: Vint on July 05, 2014, 05:02:34 PM
Я так понимаю вот подпрограммы вложенные одна в другую и это работает.
...
Ты различаешь саму подпрограмму и её вызов? Кажется не очень. Перечитай ещё раз о чём речь.
Title: Re: Обращение к скрипту по имени
Post by: Синичка on July 05, 2014, 09:09:55 PM
Возникла некоторая проблема.

Например, в скрипте вначале написано 3 подпрограмм друг за другом, названные Один,Два,Три для облегчения. после этого я вызываю подпрограмму "Два"

 for($i, $i<15)
// вызов подпрограммы
Два()
END_CYC

а далее вызываю подпрограмму Один.

Проблема заключается в том, что после того, как сработала подпрограмма "Два", она не останавливается, даже если прописать i<1. Она работает бесконечно, так и не переходя никогда на что-то последующее. Ни на Один, ни на Три... Вообще не реагирует на то, что дальше.

Вот в это "for($i, $i<15)" нельзя получается что ли пихать вызов подпрограммы?
Title: Re: Обращение к скрипту по имени
Post by: Oraven on July 05, 2014, 10:22:50 PM
раньше была ошибка с циклами и подпрограммами в них, но в последней версии это вроде бы исправлено. Возможн оу тебя ошибка в коде.
Title: Re: Обращение к скрипту по имени
Post by: Синичка on July 05, 2014, 10:55:18 PM
Code: [Select]
// вызов подпрограммы
Один()

//Первая пачка
LCLICK(129,38) 
WAITMS(2000)

LCLICK(81,88) 
WAITMS(5000)
 
FOR ($i, $i<500)   //\\\\\\\\\\\\\\\\\\\

// вызов подпрограммы
Два()

END_CYC 

WAITMS(3000)   


// вызов подпрограммы
Один()

Изменила названия) по отдельности вызовы работают, а  вот друг за другом не хотят, в чем ошибка? Третий вызов, то есть самый последний, уже не срабатывает. Хотя даже если вместо него ставить просто клики мышкой по координатам, тоже не сработает. Глючит на втором вызове и работает бесконечно, даже если не 500 будет, а 1 цикл
Title: Re: Обращение к скрипту по имени
Post by: Oraven on July 06, 2014, 09:03:26 AM
Что находится в подпрограмме Два()
Title: Re: Обращение к скрипту по имени
Post by: Синичка on July 08, 2014, 01:49:11 AM
Только клики по координатам

Code: [Select]
sub(Два)

//Вход
LCLICK(801,506) 
WAITMS(500)
LCLICK(15,601) 
WAITMS(4000)
LCLICK(354,300) 
WAITMS(1000)

end_sub

Потом то, что написала выше. Только в том, что выше, гораздо больше кликов, я просто укоротила. Ничего лишнего, только клики левой кнопкой мыши и задержки. По отдельности все работает отлично, проблема заключается лишь в
Code: [Select]
FOR ($i, $i<500)   //\\\\\\\\\\\\\\\\\\\

// вызов подпрограммы
Два()

END_CYC 

Так как на этом моменте глючит и не идет дальше. Как можно заменить, чтобы не глючило?
Title: Re: Обращение к скрипту по имени
Post by: Oraven on July 08, 2014, 02:11:44 AM
Версия кликера последняя 4.10 ?
У меня по крайней мере подпрограмма в цикле отрабатывает корректно.
Title: Re: Обращение к скрипту по имени
Post by: Atas on July 08, 2014, 10:14:24 AM
Попробуйте, для наглядности, вывести в лог работу скрипта. Вот такой скрипт будет работать?
Code: (clickermann) [Select]
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) //  Возврат в начало сценария (описание подпрограмм повторно не перечитываем)

Если все подпрограммы работают нормально, в логе должно получиться:
Code: [Select]
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 Три

Title: Re: Обращение к скрипту по имени
Post by: Синичка on July 08, 2014, 11:24:17 PM
мм.. нет, у меня получилось
Code: [Select]
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. Всё работает теперь, вопрос снят. Спасибо огромное) тут моя ошибка, не скачивала обновление.


Возник другой вопрос:
Я в конце скрипта вставляла
Code: [Select]
SOUND ("1.wav")
чтобы проигрывался звуковой файл. Возникла проблема - если файл очень большой, то надо мне вручную через некоторое время отключить работу скрипта, чтобы файл перестал работать. Но кликерман не выключается, пока не отработает весь файл, приходилось выключать звук на компьютере и ждать, либо через диспетчер закрывать. Как выключить работу кликермана при звуковом файле? Постоянно закрывать и открывать кликерман не хочется... Я резала файл, но бывает, что этого времени не хватает, а бывает наоборот, много. А как выключить, не знаю, ведь никаких звуковых дорожек не открывается, плюс к тому перед запуском скрипта приходится настраивать громкость на компьютере, потому что звуковой файл включается на полную..