Помощь - Поиск - Пользователи - Календарь
Полная версия: UO Pilot и игра с определением положения курсора
UoKit.com Форумы > Кликер > UO Pilot
MAXXIMUM
Доброго времени суток!

Столкнулся со следующей проблемой. Необходимо реализовать нажатие мыши по определенным координатам игры, которая определяет положение курсора.
Написал следующий скрипт для проверки:
Код

wait 5s
// Начало диалога с агентом
set MouseClickDelay 100
set #back 0
set #startX 100
set #startY 100
set #endX 1920
set #endY 1080
set $path D:\
set %cash[1] картинка
set #a findimage (#startX #startY #endX #endY ($path%cash[1].bmp) %crds workwindow)
set #dd %crds[1 1] + 40
set #db %crds[1 2] + 25
move %crds[1 1] %crds[1 2] workwindow
right %crds[1 1] %crds[1 2] workwindow  // кликнули
wait 1s
move #dd #db workwindow
left #dd #db workwindow // кликнули
end_script


Все работает идеально до тех пор, пока я не перекрою точку клика.
Если подробнее: при нажатии правой кнопкой выскакивает менюшка при наведении на которую кнопки подсвечиваются. Так вот пока они не подсвечены, клика по этой кнопке произойти не может. Как это реализовать?
Есть 2 условия. Окно обязательно должно быть перекрыто и одновременно должно работать 8 скриптов с разными окнами.

В дополнении ко всему. В перекрытой зоне очень криво работает команда Move. Если зона перекрыта, то только в 5% случаев курсор туда перетаскивается
DarkMaster
Цитата
Так вот пока они не подсвечены, клика по этой кнопке произойти не может. Как это реализовать?

Проверяйте цвет/ищите изображение.
Цитата
В перекрытой зоне очень криво работает команда Move. Если зона перекрыта, то только в 5% случаев курсор туда перетаскивается

Move он один для всей системы. Винда так устроена - у вас один курсор и больше не получить (существуют проги, но там кривая эмуляция, которая лишь создает видимость). Move зачастую вообще не нужен. Его часто можно вообще не прописывать либо вместо него использовать kleft_up(для неперекрытых окон) либо просто left_up(для любых окон). Так же спасает настройка "перемещать курсор в точку клика" - курсор дернется с минимальной задержкой. Однако при таком подходе остается теоретический шанс, что скрипты в одну долю секунды дернут мышь и передерутся. Чтобы избежать подобных проблем необходимо проверять успешность каждого клика (это вообще отличие любого качественного скрипта от слабой затычки), либо вы можете создать отдельный скрипт который будет управлять очередью кликов и кликать исключительно он, остальные же скрипты только будут посылать запросы на клик. Подобный скрипт даже когда-то писал и выкладывал, кажется veiron'у надо было. Тема на 3-4 странички вроде. Быстро не нашел.
MAXXIMUM
Цитата(DarkMaster @ 19.9.2017, 21:33) *

Проверяйте цвет/ищите изображение.

Не в этом дело. Пока курсор мыши не навести на кнопку, она неактивна.

Цитата

Move он один для всей системы. Винда так устроена - у вас один курсор и больше не получить (существуют проги, но там кривая эмуляция, которая лишь создает видимость). Move зачастую вообще не нужен. Его часто можно вообще не прописывать либо вместо него использовать kleft_up(для неперекрытых окон) либо просто left_up(для любых окон). Так же спасает настройка "перемещать курсор в точку клика" - курсор дернется с минимальной задержкой. Однако при таком подходе остается теоретический шанс, что скрипты в одну долю секунды дернут мышь и передерутся. Чтобы избежать подобных проблем необходимо проверять успешность каждого клика (это вообще отличие любого качественного скрипта от слабой затычки), либо вы можете создать отдельный скрипт который будет управлять очередью кликов и кликать исключительно он, остальные же скрипты только будут посылать запросы на клик. Подобный скрипт даже когда-то писал и выкладывал, кажется veiron'у надо было. Тема на 3-4 странички вроде. Быстро не нашел.


Команда left_up не изменила ситуации. Основная задача заставить приложение думать, что курсор находится именно на нем, а не на другом приложении


По поводу очереди кликов как раз мне говорили, но она не исправит ситуацию. Клики очень часто будут идти.
cirus
А что за игра?
Код
set #a findimage ()
if #a > 0   // отсутствие проверки что картинка нашлась - первый шаг к получению ошибки
    set #dd %crds[1 1] + 40  // т. к. нельзя обращаться к несуществующему элементу массива
end_if

Цитата
скрипт который будет управлять очередью кликов

Не первый раз ты его теряешь smile.gif https://forum.uokit.com/index.php?s=&sh...st&p=209321
DarkMaster
Цитата
По поводу очереди кликов как раз мне говорили, но она не исправит ситуацию. Клики очень часто будут идти.

Ну так а разницы? Накладые расходы времени выполнения скрипта при организованной очереди возрастают на величины не имеющие хоть сколько-то существенного значения. При этом учитывая специфику вашей задачи с перемещением указателя на нужный объект, будете вы одной вкладкой дергать мышь или десятью - разницы никакой, т.к. курсор один и в двух местах не окажется. По сути вопрос лишь в том будут ли у вас скрипты мешать друг другу или нет.
dron4938
Кое где встречалось такое с лазерной мышкой. Когда сдвигаешь реальную мышь, то лазер мыши загорается.
Если двигать мышь пилотом то лазер не загорается. В некоторых приложениях стоит именно такая проверка.
Выход был такой: ставил реальную мышь сверху мальнького кулера (вентилятора) вентилятор крутился под мышью и лазер всегда горел. Где то тут про это подробнее писал.
Возможно есть еще 1 выход (но это не точно) подключить обычную шариковую мышь
MAXXIMUM
Цитата(cirus @ 20.9.2017, 2:33) *

А что за игра?
Код
set #a findimage ()
if #a > 0   // отсутствие проверки что картинка нашлась - первый шаг к получению ошибки
    set #dd %crds[1 1] + 40  // т. к. нельзя обращаться к несуществующему элементу массива
end_if


Не первый раз ты его теряешь smile.gif https://forum.uokit.com/index.php?s=&sh...st&p=209321



EVE Online


Смысла особо проверять нет. Если картинки нет, то выполнение всего скрипта смысла не имеет. Означает, что скрипт сбился на перемещении, а вот как вычислять эти сбои и возвращать персонажа в нужную точку я пока еще не придумал...
MAXXIMUM
Цитата(dron4938 @ 20.9.2017, 11:03) *

Кое где встречалось такое с лазерной мышкой. Когда сдвигаешь реальную мышь, то лазер мыши загорается.
Если двигать мышь пилотом то лазер не загорается. В некоторых приложениях стоит именно такая проверка.
Выход был такой: ставил реальную мышь сверху мальнького кулера (вентилятора) вентилятор крутился под мышью и лазер всегда горел. Где то тут про это подробнее писал.
Возможно есть еще 1 выход (но это не точно) подключить обычную шариковую мышь



Думаю это не поможет. Приложение берет информацию о том, что находится ли реальный курсор в точке нажатия на кнопку. По этой причине и была добавлена команда Move в сам скрипт. Визуально это выглядит как будто в игре есть скрытый курсор свой (иногда промигивает при работе скрипта) который проверяет находится ли в том же месте реальный. Аля TeamViwer когда один курсор управляет другим.



Вариантов решения задачи немного:
1. Заставить приложение думать, что оно не перекрыто, даже если оно перекрыто другим приложением.
2. На клики которые критичны к перекрытию окон ввести команду вывода окна на первый план.
3. Сделать виртуальный монитор, который физически никуда отображаться не будет, но программно на него можно будет завести курсор (вариант не перекрытого окна за пределами области экрана не работает, пока в эту область нельзя будет перенести реальный курсор)



Третий вариант я смог частично реализовать. Смог подключить второй монитор (программно он есть, в реальности нет), но с разрешением 2500х1500 (в этих пределах). Мне же надо разместить 8 клиентов разрешением 1024х730 (клиент игры не позволяет его сделать меньшим размером). В итоге мне надо либо 2 монитора разрешением больше 2048х1460 либо один монитор разрешением больше 3072х2190 (лучший вариант DCI 4K)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Русская версия Invision Power Board © 2001-2024 Invision Power Services, Inc.