Автокликер Clickermann :: Форум
Основной раздел => Общие вопросы => Topic started by: термех on January 27, 2019, 11:45:20 PM
-
Всем доброго!
Подскажите начинающему по перетаскиванию предметов.
Имеем два окна: инвентарь игрока и хранилище. Надо перетянуть определенные предметы из одного окна в другое.
Простые клики, нажатия клавиш работают без проблем, поиск предметов тоже проходит отлично, курсор последовательно указывает на найденные предметы, и на место, в которое эти предметы необходимо перетащить. Но вот само перетаскивание не происходит.
Пробовал выставлять задержку от 50ms, до 1500ms. Пробовал передвигать курсор через "move" пошагово, от точки к точке. Пробовал без поиска предметов записать перетаскивание из окна в окно, и потом повторить, тоже не помогло.
При привязке к окну, дополнительно открытые окна никак не выделяются, они имеют ту же привязку, что и основное окно( хотя это может для других и очевидно, но я проверил, на всякий случай)
// RECORDED SCRIPT 25.01.2019
// waitms correction
#ps2_mouse
#ps2_keyboard
keyDown(70)
keyUp(70)
waitms(1527)
lDown(941,675)
lUp(941,675)
waitms(801)
GETSCREEN(1262,366,1513,682)
scanpicture($var,1257,336,1533,722,"pic.bmp",-1,80)
while(arrsize($var)>0)
$y=arrpop($var)
$x=arrpop($var)
waitms(130)
ldown($x+30,$y+30)
waitms(50)
lup(578,759)
end_cyc
halt
Единственное, что еще может направить: однажды нажал паузу в скрипте между кликом DOWN и UP, и предмет "зажало", но так, что отпустить я его уже не смог. Помогла только перезагрузка игры.
-
Ну вот почему зона снимка не сходится с зоной поиска? Не знаешь что это лучше вообще не пиши.
Тебе нужна подпрограмма плавного перемещения мыши.
Множителем скорости можно настроить количество генерируемых точек по которым будет двигаться курсор. Допустимы числа с точкой, например 0.1 - очень мало 100 - очень много
Задержкой между перемещениями можно отрегулировать скорость с которой курсор будет двигаться по точкам.
#ps2_mouse
#ps2_keyboard
SUB(mouse_move,$MOVE_END_X,$MOVE_END_Y)
$MOVE_SPEED = 10 // множитель скорости
$MOVE_Start_X = $_xmouse
$MOVE_Start_Y = $_ymouse
$MOVE_X = $MOVE_Start_X
$MOVE_Y = $MOVE_Start_Y
$dist = DIST($MOVE_END_X,$MOVE_END_Y,$MOVE_Start_X,$MOVE_Start_Y)
$MOVE_SPEEDVAR = INT((SQRT($dist))/$MOVE_SPEED)
IF($MOVE_SPEEDVAR < 1)
$MOVE_SPEEDVAR = 1
END_IF
$MOVE_step=($dist-1)/$MOVE_SPEEDVAR
$MOVE_X_step = ($MOVE_END_X-$MOVE_Start_X)/$MOVE_step
$MOVE_Y_step = ($MOVE_END_Y-$MOVE_Start_Y)/$MOVE_step
FOR($MOVE_i=0, $MOVE_i<INT($MOVE_step))
$MOVE_X = $MOVE_X + $MOVE_X_step
$MOVE_Y = $MOVE_Y + $MOVE_Y_step
MOVE(ROUND($MOVE_X,0), ROUND($MOVE_Y,0))
WAITMS(1) // задержка между перемещениями
END_CYC
MOVE($MOVE_END_X, $MOVE_END_Y)
END_SUB
//=============================================
KEYPRESS(#F)
waitms(1527)
LCLICK(941,675)
waitms(801)
GETSCREEN
SCANPICTURE($ARR_SCAN, 1257,336,1533,722, "pic.bmp",-1,80)
FOR($i=0,$i<ARRSIZE($ARR_SCAN),2)
LDOWN($ARR_SCAN[$i]+30, $ARR_SCAN[$i+1]+30)
mouse_move(578,759)
LUP(578,759)
WAITMS(50)
END_CYC
UNDEFINE($ARR_SCAN)
HALT
-
Большое спасибо за быстрый ответ. Вечером опробую, по результату отпишусь.
По поводу соответствия размеров скриншота и зоны поиска - просто описка при выкладывании скрипта, вариантов сделал несколько, где то одна ошибка, где то другая. Проверял именно передвижения курсора, а зоны поиска не проверил, ибо там все работает.
Если этим Вас огорчил, приношу свои извинения, впредь буду внимательнее.
-
Не получилось. Значения менял, задержку до 10, множитель скорости до 1000. В разных вариантах. пробовал очень много раз, ни один раз не сработало.
Если вручную перетаскиваешь предмет, сразу видно, что он тянется за курсором, в случае с кликером, никаких изменений, предмет никак не передвигается. Как будто левый клик не проходит.
-
http://crapware.aidf.org/forum/index.php?topic=3402.msg23218#msg23218
-
Обязательно попробую, спасибо. Но в данном случае, при открывании окон, начинает работать курсор, а не поворот головы. Возможно проблема в прозрачности, или чем то подобном. Что-то подобное читал, сейчас не могу найти где.
-
Нет, проблема явно не в движении мыши. Экспериментально установил, что предмет вообще не захватывается. Даже при передвижении в соседнюю клетку. Никакие задержки ситуацию не исправили. Mover так же не помог.
-
Может дело в Ps2 режиме?
-
Тут уже моя фантазия заканчивается. #ps2_mouse и #ps2_keyboard прописал, мышь и клавиатура ps2, не через переходник., где еще может быть проблема?
-
Никогда такого небыло, и вот опять... :-\
http://crapware.aidf.org/forum/index.php?topic=1300.msg6182#msg6182
А вдруг поможет?
-
У меня была похожая проблема.2 внутриигровых она,все координаты известны,,но с перетаскиванием беда.Казалось бы берешь LDOWN ,делаешь MOVE и отпускаешь на нужных координатах через LUP.Все работает прекрасно,до тех пор пока не включаешьрежим привязки.В режиме привязки почему-то работать отказывается и все тут.После нескольких неудачных попыток я заметил,что если именно записать через сам кликер перетаскивание предметов,то оно будет работать даже в оконном режиме.Я понятия не имею с чем это связано,но каким-то непостижимым образом это заработало,хотя там все то же самое по сути в коде.Мне помогло : я выкинул весь лишний код,вставил переменные какие мне нужны вместо точечных значений и скрипт заработал как я хотел. + подключил плавное движение мыши
move($x_mod+20,$y_mod-28) //ставишь мышь на позицию "откуда надо тянуть"
waitms(42)
lDown($x_mod+20,$y_mod-28)
waitms(42)
MOVE_SLOW($x_gila,$y_gila) //Куда надо тянуть
waitms(42)
lUp($x_gila,$y_gila) //отпускаем
Прекрасно работает в режиме привязки.Тянет с одного окна на другое будь здоров.
А вот вам и подпрограмма для плавного движения мыши.Скорее всего работать будет и без нее,но с ней покрасивше
SUB(MOVE_SLOW, $MOVE_END_X, $MOVE_END_Y)
$MOVE_SPEED = 15 // множитель скорости в попугаях меньше-быстрее. Можно дробный
$MOVE_Start_X = $_xmouse
$MOVE_Start_Y = $_ymouse
$MOVE_X = $MOVE_Start_X
$MOVE_Y = $MOVE_Start_Y
$dist= DIST($MOVE_END_X,$MOVE_END_Y,$MOVE_Start_X,$MOVE_Start_Y)
$MOVE_SPEEDVAR= INT((SQRT($dist))/$MOVE_SPEED)
IF($MOVE_SPEEDVAR < 1)
$MOVE_SPEEDVAR=1
END_IF
$MOVE_step=($dist-1)/$MOVE_SPEEDVAR
$MOVE_X_step = ($MOVE_END_X-$MOVE_Start_X)/$MOVE_step
$MOVE_Y_step = ($MOVE_END_Y-$MOVE_Start_Y)/$MOVE_step
FOR($MOVE_i=0, $MOVE_i<INT($MOVE_step))
$MOVE_X = $MOVE_X+$MOVE_X_step
$MOVE_Y = $MOVE_Y+$MOVE_Y_step
MOVE(ROUND($MOVE_X,0), ROUND($MOVE_Y,0))
WAITMS(1)
END_CYC
MOVE($MOVE_END_X, $MOVE_END_Y)
END_SUB
Рекомендую выкинуть ее в отдельный файл и подключить где-то в самом начале.