Author Topic: Обращение к скрипту по имени  (Read 6803 times)

0 Members and 3 Guests are viewing this topic.

Синичка

  • Освоившийся
  • **
  • Posts: 29
    • View Profile
Обращение к скрипту по имени
« on: July 03, 2014, 09:38:27 PM »
Здравствуйте.

Мне немного сложно объяснить своим обычным языком, так как термины не знаю, так что простите)
Во всём общем скрипте есть несколько повторяющихся моментов. Очень муторно искать эти "моменты" при малейших изменениях координат и все менять на новые.
Можно ли в самом начале прописать скрипт, задать ему имя, и чтобы эти повторяющиеся "моменты" просто обращались к этому с заданными параметрами скрипту по имени, выполняя то, что там прописано?

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Обращение к скрипту по имени
« Reply #1 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")

Синичка

  • Освоившийся
  • **
  • Posts: 29
    • View Profile
Re: Обращение к скрипту по имени
« Reply #2 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, например, а не одну

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Обращение к скрипту по имени
« Reply #3 on: July 04, 2014, 11:17:42 AM »
Да, главное чтобы у каждой подпрограммы было свое имя, они были выше вызова, и еще нельзя вкладывать подпрограмму в подпрограмму.

Atas

  • Активный участник
  • ***
  • Posts: 147
    • View Profile
Re: Обращение к скрипту по имени
« Reply #4 on: July 04, 2014, 08:50:41 PM »
Всем привет :)
Сорри что не по теме пишу, просто "не вынесла душа поэта", а новую тему создавать нет смысла.
Запреты в написании скриптов на использование чего либо всегда есть, и правила хорошего тона тоже существуют.
Хочу выступить в защиту "богомерзкого" GOTO и по поводу "нельзя вкладывать подпрограмму в подпрограмму".
Вот мой рабочий скрипт для воина в World of Warcraft: Mists of Pandaria. Он не доделанный и не оптимизированный, но рабочий и достаточный для прокачки персонажа и чтобы попасть в на вершину рейтинга по нанесенному урону среди игроков на поле боя.
Это не бот, а ассистент для боя (или "выпрямитель рук"), от игрока требуется только подойти к цели на расстояние атаки и стоять лицом к противнику. Всё остальное скрипт сделает сам. Но не в этом в общем дело. Посмотрите на количество GOTO в скрипте и вложенные друг в друга подпрограммы. Там всего один GETSCREEN на весь сценарий.
Задача была такая, чтобы после выполнения каждого атакующего действия скрипт возвращался в начало сценария и проверял, не готово ли более высокое по приоритету действие. И, если готово, то выполнил именно его, так как оно будет самым правильным в данный момент боя. Можно ли как то написать по другому я не знаю, и надо ли всё усложнять? Читаемость скрипта по моему отличная, скорость выполнения даже избыточная. Структура скрипта пока простейшая.

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

Конечно я всё сделал не "по понятиям", но я рискнул и у меня получилось, чего и вам желаю. :)
Скрипт во вложении.
« Last Edit: November 14, 2014, 07:51:49 PM by Atas »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Обращение к скрипту по имени
« Reply #5 on: July 04, 2014, 09:42:24 PM »
Зачем ты путаешь людей. Где в этом скрипте вложенные подпрограммы?
Тем более, что речь шла о вкладывании "тела" подпрограммы в "тело" другой, что не касается вызовов подпрограмм. Вызывать можешь сколь угодно глубоко и часто.

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


С GOTO можешь писать как тебе удобно если пока не умеешь по-другому. Ничего в этом страшного нет на этой стадии.
Без GOTO можно написать не менее красиво и не менее понятно, это дело привычки. Поймёшь когда логика работы понадобиться больше 4 шагов и очень ветвистая.


Atas

  • Активный участник
  • ***
  • Posts: 147
    • View Profile
Re: Обращение к скрипту по имени
« Reply #6 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

Я же признаю, что что накосячил сильно, но работает же. :)

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Обращение к скрипту по имени
« Reply #7 on: July 04, 2014, 11:40:01 PM »
В этом отрывке только одна подпрограмма SUB(Сбить_каст) остальное условие свитч и вызовы подпрограмм. Все написано верно.


Синичка

  • Освоившийся
  • **
  • Posts: 29
    • View Profile
Re: Обращение к скрипту по имени
« Reply #8 on: July 05, 2014, 02:21:50 AM »
Подскажите, пожалуйста, где-то была тема, как переместить определенное окно из всех открытых в нужные координаты. И даже с заданными шириной-высотой. Найти не могу, как это сделать? На данный момент такое необходимо с мазилой и калькулятором

Atas

  • Активный участник
  • ***
  • Posts: 147
    • View Profile
Re: Обращение к скрипту по имени
« Reply #9 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

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Обращение к скрипту по имени
« Reply #10 on: July 05, 2014, 05:02:34 PM »
Я так понимаю вот подпрограммы вложенные одна в другую и это работает.
...
Ты различаешь саму подпрограмму и её вызов? Кажется не очень. Перечитай ещё раз о чём речь.


Синичка

  • Освоившийся
  • **
  • Posts: 29
    • View Profile
Re: Обращение к скрипту по имени
« Reply #11 on: July 05, 2014, 09:09:55 PM »
Возникла некоторая проблема.

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

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

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

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

Вот в это "for($i, $i<15)" нельзя получается что ли пихать вызов подпрограммы?

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Обращение к скрипту по имени
« Reply #12 on: July 05, 2014, 10:22:50 PM »
раньше была ошибка с циклами и подпрограммами в них, но в последней версии это вроде бы исправлено. Возможн оу тебя ошибка в коде.

Синичка

  • Освоившийся
  • **
  • Posts: 29
    • View Profile
Re: Обращение к скрипту по имени
« Reply #13 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 цикл

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Обращение к скрипту по имени
« Reply #14 on: July 06, 2014, 09:03:26 AM »
Что находится в подпрограмме Два()