Author Topic: Изменение команд движения мыши  (Read 41192 times)

0 Members and 1 Guest are viewing this topic.

vovan13

  • Зашел в гости
  • *
  • Posts: 8
    • View Profile
Изменение команд движения мыши
« on: October 17, 2012, 01:43:34 AM »
добавить к командам LClick или MOVE не обязательный параметр speed , чтобы при кликах курсор не скакал по точкам, а плавно переходил от одной точки к другой, как живой :)

типа вот этого: MOVE($x,$y,$speed)

В играх ставят проверку на движение мыши, если кликер скачет тупо по точкам, вылазит всякая гадость для проверки игрока. Я конеша написал инклудик для плавной работы, но время выполнения сценария увеличилось.

Сергей

  • Активный участник
  • ***
  • Posts: 159
    • View Profile
Re: Изменение команд движения мыши
« Reply #1 on: October 17, 2012, 02:27:19 AM »
Конечно увеличилось, ведь для перемещения нужно время! ;D Или ты хочешь какой-нибудь асинхронный метод для этого? Сложно подобное будет автору реализовать.

Кстати, раз уж написал, то поделись инклудом! Все, думаю, тебе спасибо скажут.  ::)
Отсутствую.

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Изменение команд движения мыши
« Reply #2 on: October 17, 2012, 08:18:25 AM »
Вот скрипт для плавного перемещения мыши

Code: [Select]
$x2 = 2 // точка перемещения X
$y2 = 2 // точка перемещения Y
$x1 = $_xmouse
$y1 = $_ymouse
$speed = 5

if (($x1 > $x2) & ($y1 > $y2))
   while(($x1 > $x2) | ($y1 > $y2))
      if ($x1 > $x2)
         MOVE($x1-$speed, $y1)
         $x1 = $x1-$speed
      end_if
     
      if ($y1 > $y2)
         MOVE($x1, $y1-$speed)
         $y1 = $y1-$speed
      end_if
   END_CYC
end_if

if (($x1 < $x2) & ($y1 < $y2))
   while(($x1 < $x2) | ($y1 < $y2))
      if ($x1 < $x2)
         MOVE($x1+$speed, $y1)
         $x1 = $x1+$speed
      end_if
     
      if ($y1 < $y2)
         MOVE($x1, $y1+$speed)
         $y1 = $y1+$speed
      end_if
   END_CYC
end_if

if (($x1 < $x2) & ($y1 > $y2))
   while(($x1 < $x2) | ($y1 > $y2))
      if ($x1 < $x2)
         MOVE($x1+$speed, $y1)
         $x1 = $x1+$speed
      end_if
     
      if ($y1 > $y2)
         MOVE($x1, $y1-$speed)
         $y1 = $y1-$speed
      end_if
   END_CYC
end_if

if (($x1 > $x2) & ($y1 < $y2))
   while(($x1 > $x2) | ($y1 < $y2))
      if ($x1 > $x2)
         MOVE($x1-$speed, $y1)
         $x1 = $x1-$speed
      end_if
     
      if ($y1 < $y2)
         MOVE($x1, $y1+$speed)
         $y1 = $y1+$speed
      end_if
   END_CYC
end_if

halt
« Last Edit: October 17, 2012, 08:19:56 AM by Oraven »

vovan13

  • Зашел в гости
  • *
  • Posts: 8
    • View Profile
Re: Изменение команд движения мыши
« Reply #3 on: October 17, 2012, 02:52:08 PM »
У меня немного по другому

Code: [Select]
#name "MOVE"
//начальные точки
$startx=$_xmouse
$starty=$_ymouse
// конечные точки
$finishx= 150
$finishy= 150
// скорость перемещения
$MOVEX=10 // X
$MOVEy=8  // Y

//проверка если курсор возле края экрана
IF($startx>$_xmax-100)
$startx=$_xmax-100
END_IF
IF($starty>$_ymax-50)
$starty=$_ymax-50
END_IF
IF($startx<50)
$startx=50
END_IF
IF($starty<20)
$starty=20
END_IF
// проверяем куда двигать курсор + или -
$cheakx=DIST($startx,$starty,$finishx,$starty)
$cheaky=DIST($startx,$starty,$startx,$finishy)
MOVE($startx+$MOVEX,$starty+$MOVEy)

IF ($cheakx<DIST($_xmouse,$_ymouse,$finishx,$_ymouse))
 $MOVEX=0-$MOVEX
END_IF
IF ($cheaky<DIST($_xmouse,$_ymouse,$_xmouse,$finishy))
 $MOVEY=0-$MOVEY
END_IF

//двигаем курсор
WHILE (($starty!$finishy) &($startx!$finishx))
 
MOVE($startx,$starty)

IF (DIST($_xmouse,$_ymouse,$finishx,$_ymouse)>10)
 $startx=$startx+$MOVEX
ELSE
 $startx=$finishx
END_IF

 IF (DIST($_xmouse,$_ymouse,$_xmouse,$finishy)>10)
 $starty=$starty+$MOVEy
ELSE
 $starty=$finishy
END_IF

END_CYC
« Last Edit: October 17, 2012, 03:52:47 PM by vovan13 »

Сергей

  • Активный участник
  • ***
  • Posts: 159
    • View Profile
Re: Изменение команд движения мыши
« Reply #4 on: October 17, 2012, 10:39:17 PM »
Оформили бы это в подпрограмму.

Кстати, подпрограммы можно сувать в инклуды и оттуда их вызывать?
Это ведь можно было бы целые библиотеки запиливать! Хотя, судя по справке, инклуд просто останавливает родительский скрипт, выполняется, и затем включает родительский скрипт обратно.
Если бы вместо этого препроцессор сначала собирал все в один большой файл, то можно было бы библиотеки делать.

И у вас скрипты передвигают курсор со скоростями по осям. При этом относительная скорость между точками будет больше чем скорость перемещения. Это приводит к тому, что если курсор двигается не ровно под 45 градусов, то до одной оси он дойдет быстрее. Конечно это работает, но выглядит не очень круто. Лучше бы сделать чтобы он двигался с одинаковой скоростью по ровно линии.
Смотрите на рисунок, там немного попытался разъяснить к чему я.

Хотя чтобы узнать угол между точками нужна фун-я atan2, а тут её нет. Только базовые sqrt, sin и cos. Надо ждать от автора расширенной поддержки математических функций.

UPD: Подпрограммы из инклудов нормально вызываются, это я туплю.
« Last Edit: October 18, 2012, 12:36:09 AM by stupid_reg »
Отсутствую.

Сергей

  • Активный участник
  • ***
  • Posts: 159
    • View Profile
Re: Изменение команд движения мыши
« Reply #5 on: October 18, 2012, 04:34:57 AM »
Написал свой вариант, более быстрый и оптимизированный.
Как использовать:

Code: [Select]
#include "MOVE2.cms"


$MOVE2_END_X = 2 // Конечная координата X
$MOVE2_END_Y = 2 // Конечная координата Y
$MOVE2_SPEED = 2 // За сколько секунд курсор пройдет путь
GOSUB(MOVE2) // Вызываем подпрограмму

waitms(1000) // Не обязательно

$MOVE2_END_X = 1000
$MOVE2_END_Y = 1000
$MOVE2_SPEED = 0.5 // дробные числа работают
GOSUB(MOVE2)

...

Т.е. подключаем инклуд, задаем координаты и скорость через глобальные переменные и вызываем подпрограмму MOVE2. Быстро и просто, код не засоряется лишним мусором. Все переменные в своем именном пространстве, можно не беспокоится что что-то где-то совпадет.

UPD: исправил скобку и лишнее объявление переменных.
« Last Edit: October 18, 2012, 10:58:44 AM by stupid_reg »
Отсутствую.

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Изменение команд движения мыши
« Reply #6 on: October 18, 2012, 09:35:48 AM »
Скрипт лучше всех, но вот это лишнее...

#name "MOVE2 include"

$MOVE2_X
$MOVE2_Y
$MOVE2_X_SPEED
$MOVE2_Y_SPEED
$MOVE2_ROUNDED_SPEED


$MOVE2_END_X = $_xmouse // Конечная координата X
$MOVE2_END_Y = $_ymouse// Конечная координата Y
$MOVE2_SPEED = 1 // За сколько секунд курсор пройдет путь
$MOVE2_OPSPERSEC = 850 //Примерно 850 операций в секунду, может различаться на разных компьютерах
$MOVE2_DEBUG = 0 // 1 для вывода сообщений в лог

SUB(MOVE2)
   $MOVE2_X = $_xmouse
   $MOVE2_Y = $_ymouse
   
   $MOVE2_ROUNDED_SPEED = ROUND($MOVE2_SPEED*$MOVE2_OPSPERSEC,0)
   $MOVE2_X_SPEED = ($MOVE2_END_X-$MOVE2_X)/($MOVE2_ROUNDED_SPEED)
   $MOVE2_Y_SPEED = ($MOVE2_END_Y-$MOVE2_Y)/($MOVE2_ROUNDED_SPEED)
   
   IF($MOVE2_DEBUG = 1)
      PRINT("start")
   END_IF
   FOR($i, $i < $MOVE2_ROUNDED_SPEED){
      $MOVE2_X = $MOVE2_X+$MOVE2_X_SPEED
      $MOVE2_Y = $MOVE2_Y+$MOVE2_Y_SPEED
      MOVE(ROUND($MOVE2_X,0), ROUND($MOVE2_Y,0))
   END_CYC
   IF($MOVE2_DEBUG = 1)
      PRINT("done")
   END_IF
   MOVE($MOVE2_END_X, $MOVE2_END_Y)//Передвинуть окончательно в заданную точку
END_SUB
« Last Edit: October 18, 2012, 09:39:47 AM by Oraven »

Сергей

  • Активный участник
  • ***
  • Posts: 159
    • View Profile
Re: Изменение команд движения мыши
« Reply #7 on: October 18, 2012, 11:00:30 AM »
Oraven, да, ты прав, это объявление лишнее. Забыл удалить.
Кстати, интерпретатор на эту скобку не ругнулся. Я её не заметил вообще.  ???
Обновил.
Отсутствую.

WEREWOLF

  • Освоившийся
  • **
  • Posts: 28
  • Волчонок
    • View Profile
Re: Изменение команд движения мыши
« Reply #8 on: October 18, 2012, 02:13:02 PM »
мда по сравнению с вами программерами скриптописцами я полный нуб

я очень редко залезаю в редактор, (обычно если по какой то причине не получается через автозапись записать какоето действие)
Человек с душой волка
Волк с телом человека

СлавьЯнИнъ

  • Активный участник
  • ***
  • Posts: 179
    • View Profile
Re: Изменение команд движения мыши
« Reply #9 on: October 25, 2012, 06:19:54 AM »
Идея хорошая о "медленном перемещении мыши".
Передвижение по ровной линии можно зделать через отношение сторон площади перемещения.
На досуге опишу.
добрый смех равняет всех

ЦИТРИН

  • Супермодератор
  • Оплот сообщества
  • *
  • Posts: 484
  • Марафон опавших листьев, коктейль из дыма и мыслей
    • View Profile
Re: Изменение команд движения мыши
« Reply #10 on: October 26, 2012, 09:12:59 PM »
Нельзя ли  в новый версиях  добавить  команду  эдакого форсированного SUPERLCLICK?
 Типа  мув +wait+ элдаун +wait+ элап.
 В целом ряде приложений  только этот набор команд и спасает.
Бабочки полёт будит тихую поляну в солнечном свету...

СлавьЯнИнъ

  • Активный участник
  • ***
  • Posts: 179
    • View Profile
Re: Изменение команд движения мыши
« Reply #11 on: October 26, 2012, 10:18:56 PM »
Это в каких например? Для чего это нужно?
добрый смех равняет всех

ЦИТРИН

  • Супермодератор
  • Оплот сообщества
  • *
  • Posts: 484
  • Марафон опавших листьев, коктейль из дыма и мыслей
    • View Profile
Re: Изменение команд движения мыши
« Reply #12 on: October 26, 2012, 11:02:27 PM »
Это в каких например? Для чего это нужно?
Применял в разных приложениях (браузер хром).
Вероятно это нужно для чего-то.
 Обычный клик  часто не приводит к нужным результатам.  Даже  делал нарочитую мультипликацию простых элкликов (до 5-7 нажатий).
Бесполезно.
А вот всякие примочки ( типа подергивания  поля  браузера стрелками вверх-вниз на 1 элклик ну и SUPERLCLICK )вот они основательно помогают от зависаний.
Бабочки полёт будит тихую поляну в солнечном свету...

СлавьЯнИнъ

  • Активный участник
  • ***
  • Posts: 179
    • View Profile
Re: Изменение команд движения мыши
« Reply #13 on: October 27, 2012, 07:36:40 AM »
А вот всякие примочки ( типа подергивания  поля  браузера стрелками вверх-вниз на 1 элклик ну и SUPERLCLICK )вот они основательно помогают от зависаний.
Можно подробней? Я могу этот эффект у себя пронаблюдать?
добрый смех равняет всех

Сергей

  • Активный участник
  • ***
  • Posts: 159
    • View Profile
Re: Изменение команд движения мыши
« Reply #14 on: October 27, 2012, 11:23:20 AM »
Нельзя ли  в новый версиях  добавить  команду  эдакого форсированного SUPERLCLICK?
 Типа  мув +wait+ элдаун +wait+ элап.
 В целом ряде приложений  только этот набор команд и спасает.
Внезапно хорошая идея. Хотя были бы пользовательские функции, это можно было бы запилить инклудами.

Это в каких например? Для чего это нужно?
Почти во всех играх, там нажатие не успевает зафиксироваться. Обычно там используются не слушатели устройств ввода, а проверка нажатия на каждой итерации, изза чего нажатие быстрее 1 кадра не учитывается.
Отсутствую.