Author Topic: Вопросы новичка  (Read 5351 times)

0 Members and 2 Guests are viewing this topic.

K7A4

  • Зашел в гости
  • *
  • Posts: 14
    • View Profile
Вопросы новичка
« on: November 27, 2014, 09:20:53 PM »
Решил создать подобную тему.
Похожей не нашел.

Первый вопрос:
а нельзя передать в процедуру в качестве параметра массив (точнее фактически ссылку на него)?
Т.е. указать при вызове имя массива, а в процедуре уже использовать его как массив.
Или можно как-то иначе?

Заранее благодарю.

Johnny

  • Создатель
  • Герой форума
  • *
  • Posts: 593
    • View Profile
Re: Вопросы новичка
« Reply #1 on: November 27, 2014, 09:29:49 PM »
не, ссылочные типы данных отсутствуют, может позже.
если очень хочется, можешь через функции записи, чтения массива из файла попробовать, там тоже довольно быстро. в качестве параметра соотв. имя файла

K7A4

  • Зашел в гости
  • *
  • Posts: 14
    • View Profile
Re: Вопросы новичка
« Reply #2 on: November 27, 2014, 09:57:16 PM »
Johnny, спасибо зо ответ. Очень приятно. )

Интересно, что заполнять массив и предполагалось из ini-файла.
Но процедуру надо бы вызывать несколько раз в секунду (ожидание появления одной из картинок, со списком имен их файлов как раз в массиве) и каждый раз грузить ini - не айс ((

Сорри, почитал про TFReadArr, померил скорость (1000 загрузок - менее 3 секунд) - не критично. Подходит.
Еще раз спасибо! )
« Last Edit: November 27, 2014, 10:36:54 PM by K7A4 »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Вопросы новичка
« Reply #3 on: November 27, 2014, 11:09:51 PM »
Это прямо такая универсальная функция которую ты будешь подключать к разным скриптам? Если нет, то зачем такие сложности? Вообще не передавай массив, просто используй глобальный.
А вот если универсальная, где массивы могут быть разные, тогда только через файл. Или каждому свою подпрограмму.


K7A4

  • Зашел в гости
  • *
  • Posts: 14
    • View Profile
Re: Вопросы новичка
« Reply #4 on: November 27, 2014, 11:30:03 PM »
Универсальная - не универсальная, к разным - не разным, но фактически еще только начав писать бота уже трижды ищу разные наборы картинок.
А ведь еще эта функция впишет в пределы экрана (усечет) область поиска и округлит значения ее координат. Удобно.
Ей же можно задать максимальное время ожидания - и она вернет в $_Return3 или 0 (если так ничего и не появилось) или номер найденой картинки (а в $_Return1 и $_Return2 - ее координаты).

А вообще, возможно, подобную функцию стоило бы реализовать "системно" в кликере.
Мне то приходится использовать в цикле If_Picture_In(), каждый раз перебирая весь буфер (пока не попадется очередной образец), а можно было бы за один проход сразу искать все картинки - какая раньше встретится. Но это уже в идеи. )

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Вопросы новичка
« Reply #5 on: November 28, 2014, 09:00:44 AM »
...
Мне то приходится использовать в цикле If_Picture_In(), каждый раз перебирая весь буфер (пока не попадется очередной образец), а можно было бы за один проход сразу искать все картинки - какая раньше встретится. Но это уже в идеи. )
А с чего ты взял, что так будет быстрее? Я думаю от ситуации будет зависеть. Когда и быстрее, но чаще медленней.
Может там изменения незначительные и достаточно будtт colormode+%  ?
Хотя нередки случаи где действительно нужен перебор. Я тоже часто пользуюсь различными вариантами подпрограмм тоже с флагом найденности, даже не для перебора, а обычного поиска, но создавать для этого отдельную смысла нет.
Code: (clickermann) [Select]
//===  поиск картинки с ожиданием 10 сек. ======================================
SUB(FIND_PIC, $stcoord_X,$stcoord_Y,$encoord_X,$encoord_Y,$name_image,$percent,$colorm)
   
   // Пример вызова:
   //FIND_PIC(0,0,$_xmax,$_ymax,"pic.bmp",90,6)
   //$stcoord_X,$stcoord_Y,$encoord_X,$encoord_Y // область поиска
   //$name_image = "islands.bmp" // имя картинки
   //$percent = 100 // процент совпадения
   //$colorm = 0 // режим колормода
   
   $pic_find = 0
   IF($mmov = 0)
      MOVE(0,$_ymax)  //паркуемся
      WAITMS(20)
   END_IF
   
   $time_notfound = $_time_t+10 // 10 сек
   WHILE(($pic_find = 0) & ($time_notfound > $_time_t))
      GETSCREEN
      IF($colorm ! 0)
         COLORMODE($colorm, $stcoord_X,$stcoord_Y,$encoord_X,$encoord_Y)
      END_IF
      IF_PICTURE_IN ($stcoord_X,$stcoord_Y,$encoord_X,$encoord_Y,STRCONCAT("textures\",$name_image),-1,$percent)
         $pic_find = 1
         IF($log=1)
            LOGWRITE ("Найдена картинка  ",$name_image," в X/Y ",$_return1," / ",$_return2)
         END_IF
      ELSE
         WAITMS(50)
      END_IF
   END_CYC
END_SUB

//==============================================================================

Ещё вариант передавать не массив, а индексы-диапазон индексов. Но лучше упорядочить картинки дав им буквенно-числовые имена в нужном порядке, тогда перебор вообще легко осуществим без массивов.
« Last Edit: November 28, 2014, 09:02:21 AM by Vint »


MoonLight

  • Зашел в гости
  • *
  • Posts: 1
    • View Profile
Re: Вопросы новичка
« Reply #6 on: December 31, 2014, 06:42:05 PM »
Могли бы вы написать коды и псевдонимы данных клавиш на клаве:
1. Стрелки (Вверх, вниз, влево, вправо).
2. И enter.
Заранее благодрарю)

K7A4

  • Зашел в гости
  • *
  • Posts: 14
    • View Profile
Re: Вопросы новичка
« Reply #7 on: March 13, 2015, 03:26:35 PM »
Подскажите, пожалуйста, как правильнее все в скрипте закрыть окно (например - с браузером)?
Причем в идеале с результатом - закрыто или нет (зависло, пока еще не закрыто и т.д.)

Вижу варианты:
1. Кликнуть на крестик в правом верхнем углу. Но разве что ждать пропадания этого крестика.
2. Выдать в окно ALT+F4. Но как проверять - вообще не понятно.
3. Может быть можно как-то через SENDMESSAGE, POSTMESSAGE? Но как? И как узнать закрылось или нет?

Заранее спасибо.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Вопросы новичка
« Reply #8 on: March 13, 2015, 04:07:34 PM »
Чтобы наверняка, процесс можно убить
Code: (clickermann) [Select]
EXECUTE("TASKKILL","/F /IM firefox.exe")
Но так закроет все открытые окна firefox.exe

ключи разные можно использовать
Code: [Select]

 /F                             Принудительное завершение процесса
 /PID <процесс>       Идентификатор процесса, который требуется завершить.
 /IM  <образ>           Имя образа процесса, который требуется завершить. Для указания всех процессов можно использовать символ шаблона '*'.
 /T                             Завершение указанного процесса и всех его дочерних процессов.





Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Вопросы новичка
« Reply #9 on: March 13, 2015, 04:18:58 PM »
Подскажите, пожалуйста, как правильнее все в скрипте закрыть окно (например - с браузером)?
Причем в идеале с результатом - закрыто или нет (зависло, пока еще не закрыто и т.д.)

Вижу варианты:
1. Кликнуть на крестик в правом верхнем углу. Но разве что ждать пропадания этого крестика.
2. Выдать в окно ALT+F4. Но как проверять - вообще не понятно.
3. Может быть можно как-то через SENDMESSAGE, POSTMESSAGE? Но как? И как узнать закрылось или нет?

Заранее спасибо.

Вот пример, Проверяет есть ли окно по заголовку и посылает ему команду закрыть, через SENDMESSAGE.

Code: (clickermann) [Select]
$zag = "Блокнот"
WHILE((WNDFIND($zag,0) > 0))
   SENDMESSAGE(WNDFIND($zag,0),0x0010,0,0)
   WAITMS(300)
END_CYC

HALT

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Вопросы новичка
« Reply #10 on: March 13, 2015, 04:23:18 PM »
Вот пример, Проверяет есть ли окно по заголовку и посылает ему команду закрыть, через SENDMESSAGE.

Code: (clickermann) [Select]
$zag = "Блокнот"
WHILE((WNDFIND($zag,0) > 0))
   SENDMESSAGE(WNDFIND($zag,0),0x0010,0,0)
   WAITMS(300)
END_CYC

HALT

Так если не закроется - зациклится пока не устраним причину.
Нужно писать ещё обработку что делать...

Например файл был изменён и потребует сохранения. Нужно ответить или мышью или клавой (клик или Enter)

Тогда уж все способы хороши и ALT+F4 и SENDMESSAGE. Если просто проверить потом закрылось или нет.
« Last Edit: March 13, 2015, 04:26:40 PM by Vint »