Author Topic: Определение направления движения объекта  (Read 3119 times)

0 Members and 1 Guest are viewing this topic.

bogdant

  • Зашел в гости
  • *
  • Posts: 8
    • View Profile
Здравствуйте!
Помогите, пожалуйста, решить такую задачу:
необходимо, чтобы кликер определил в каком направлении движется объект (цвет уникальный, в зоне работы такой больше не встречается), и в случае, если он движется влево - кликал на одну кнопку, если вправо - то на другую.
Хотя бы подскажите, возможно ли это, и если да, то с помощью чего...
Заранее благодарю всех кто откликнется!

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
как то так

Code: (clickermann) [Select]
GETSCREEN
IF_PIXEL_IN(300,300, 700,700, 255)
   $x1 = $_return1
   $y1 = $_return2
   DEFINE($x2, $x1)
   DEFINE($y2, $y1)
   //   LOGWRITE ("X ", $x1, " Y ", $y1)
   
   IF(($x1 = $x2)&($y1 = $y2))
      WAITMS(50)
   ELSE
      IF($x1 < $x2)
         LOGWRITE ("Влево")
      END_IF
      IF($x1 > $x2)
         LOGWRITE ("Вправо")
      END_IF
     
      IF($y1 < $y2)
         LOGWRITE ("Вверх")
      END_IF
      IF($y1 > $y2)
         LOGWRITE ("Вниз")
      END_IF
     
      $x2 = $x1
      $y2 = $y1
      WAITMS(50)
   END_IF
END_IF

bogdant

  • Зашел в гости
  • *
  • Posts: 8
    • View Profile
Спасибо огромное, вроде все понятно! Завтра буду пробовать :) Так просто! Вот что значит профессионал! А я мозги вывихнул, и все без толку...

bogdant

  • Зашел в гости
  • *
  • Posts: 8
    • View Profile
Еще раз спасибо, все работает именно так как я хотел!

bogdant

  • Зашел в гости
  • *
  • Posts: 8
    • View Profile
Уважаемый Oraven, в процессе возникли пара вопросов по предложенному Вами варианту решения задачи:
1. $y1 = $_return2
    DEFINE($y2, $y1) если я правильно понимаю, это объявление переменных, а разве оно не должно предшествовать первому использованию? Если спросил глупость извиняюсь...
2. Срабатывает это примерно в одной трети случаев, я решил, что поскольку участок, на котором определяется направление очень небольшой - 20рх, а движение довольно шустрое, то скрипт просто не успевает, уменьшил WAITMS до 10, но все равно очень часто не срабатывает, можете ли посоветовать что-нибудь, и до какой цифры можно уменьшать WAITMS?
Заранее спасибо!

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Ты покажи свой вариант.
Если тебе нужно только лево-право, удали лишнее.
Задай в GETSCREEN область снимка.
Пауза там в двух местах, сделай настройку в одном месте если нужно.
Это весь код? Будет крутится в цикле? Тогда нужно разгрузить, если не найдено.
После отладки закоменть выводы в лог - LOGWRITE он работает медленно.
Ну вроде всё.

Code: (clickermann) [Select]
DEFINE($pause, 10)
GETSCREEN(300,300, 321,321)  // область на 1 больше!!!
IF_PIXEL_IN(300,300, 320,320, 255)
   $x1 = $_return1
   DEFINE($x2, $x1)
   
   IF($x1 ! $x2)
      IF($x1 < $x2)
         LOGWRITE ("Влево")
      ELSE
         LOGWRITE ("Вправо")
      END_IF
      $x2 = $x1
   END_IF
   WAITMS($pause)
ELSE
   WAITMS(10)
END_IF


NStra

  • Освоившийся
  • **
  • Posts: 45
  • Подпись под аватаром.
    • View Profile
Quote
1. $y1 = $_return2
    DEFINE($y2, $y1)
$y1 и $y2 - разные переменные.
DEFINE($y2, $y1) Объявляет переменную $y2, и присваивает ей значение переменной $y1.
Quote
уменьшил WAITMS до 10, но все равно очень часто не срабатывает
Чем меньше значение задержки, тем быстрее работает скрипт.
« Last Edit: March 26, 2015, 02:23:23 PM by NStra »
Тут должна быть подпись...

bogdant

  • Зашел в гости
  • *
  • Posts: 8
    • View Profile
Quote
1. $y1 = $_return2
    DEFINE($y2, $y1)
$y1 и $y2 - разные переменные.
Quote
уменьшил WAITMS до 10, но все равно очень часто не срабатывает
Чем меньше значение задержки, тем быстрее работает скрипт.

Я понимаю, что $y1 и $y2 разные переменные, но первая из них сначала используется, а затем объявляется, а вторая наоборот, поэтому у меня недоумение, как правильно?
И с уменьшением задержки тоже понятно, но вопрос, до какой степени целесообразно ее уменьшать, чтобы увеличить вероятность того, что пролетающий через диапазон объект не просто будет замечен, но и будет определено его направление

bogdant

  • Зашел в гости
  • *
  • Posts: 8
    • View Profile
Ты покажи свой вариант.
Если тебе нужно только лево-право, удали лишнее.
Задай в GETSCREEN область снимка.
Пауза там в двух местах, сделай настройку в одном месте если нужно.
Это весь код? Будет крутится в цикле? Тогда нужно разгрузить, если не найдено.
После отладки закоменть выводы в лог - LOGWRITE он работает медленно.
Ну вроде всё.

У меня получилось так, но клик срабатывает через раз :(

Code: (clickermann) [Select]
GETSCREEN
IF_PIXEL_IN(980,340, 1044,360, 657930)
   $y1 = $_return2
   DEFINE($y2, $y1)
 
   IF($y1 = $y2)
      WAITMS(10)
   ELSE
      IF($y1 > $y2) //Вниз
         LCLICK(1115,393)
      END_IF
 
      $y2 = $y1
      WAITMS(10)
   END_IF
END_IF
« Last Edit: March 26, 2015, 03:00:52 PM by Vint »

NStra

  • Освоившийся
  • **
  • Posts: 45
  • Подпись под аватаром.
    • View Profile
bogdant
DEFINE($y2, $y1) Объявляет переменную $y2, и присваивает ей значение переменной $y1.
Ты не ставь такую короткую задержку, что у тебя происходит за 10 миллисекунд?
Минимальное значение Waitms это 1, что по себе равно 1 миллисекунде, но компьютер просто не успевает осуществить такую задержку. Он не так быстро реагирует, поэтому задержки не производится.
P.S. В одной секунде 1000 миллисекунд.
« Last Edit: March 26, 2015, 02:55:37 PM by NStra »
Тут должна быть подпись...

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Всё нормально. Задай область для GETSCREEN

Code: (clickermann) [Select]
GETSCREEN(980,340, 1045,361)
Если конечно у тебя не в привязке работает.

С задержкой поиграйся. Может не стоит сильно уменьшать. Бывает при слишком малой задержке, проц нагружается поиском сильнее, что в свою очередь тормозит приложение которое рисует то, что мы ищем.
Поставишь слишком малое, может рисовать реже. Смысл нам искать каждые 5 мс, если обновлять успевает раз в 100.