Что нового

[Автоматизация] PixelSearch и условное выполнение выражения

Статус
Закрыто для дальнейших ответов.

JFR

Новичок
Сообщения
6
Репутация
0
Салам валейкуме всем! помоги пожалуйста довести до ума скприпт который выполняет следующие функции:

1.Идет ещет моба по диагонали вверхЛево и через определенное время внизПраво. (бесконечный цикл)
2.При нахождении моба в указанной области экрана должен приостанавливать цикл №1 симулировать нажатие клавишь указаных в примере.(применять скилы на атаку и собирание под персом дропа)
3.После того как убит моб(пропадет его цвет), включается цикл №1 и продожает работать все это по замкнутому кругу.
Как правильно сделать работоспособный цикл или создать независимую работу циклов или обойти проблему
"Пока не завершится цикл1 не начнётся другой цикл2"
Пример:

Код:
While 1 
    Sleep(10)
$color=0xE90202	
$var=Pixelsearch(150,100,1250,950, $color,1)
if not @error then
	Sleep(100)
	ToolTip ("    Цель найдена    ",303,0)
    MouseMove($var[0],$var[1],1)	
	Send ("1")
	Send ("2")
	Send ("{SPACE 2}")
	Send ("{SPACE 2}")
	MouseClick("left")
Else
	While  $color
		Sleep (200)
	AutoItSetOption ("MouseClickDelay",300)
	MouseClick ("right",150,150,50)
	ToolTip ('Побежали искать цель ЛЕВОвверх',0,0)
	
	Sleep(200)
	AutoItSetOption ("MouseClickDelay",300)
	MouseClick ("right",1200,800,50)
	ToolTip ('Побежали искать цель ПРАВОвниз',0,0)
	Sleep (2000)
	WEnd
EndIf
Sleep(10)
ToolTip ("    ОК    ",400,0)
Send ("{SPACE}")
Sleep(10)
MouseUp("left")
    For $i=0 To 5
    Next
	WEnd

помогите решить проблему
 

sngr

AutoIT Гуру
Сообщения
1,011
Репутация
409
Сделай циклы, вложениые один в другой.
 

sngr

AutoIT Гуру
Сообщения
1,011
Репутация
409
Как то так
Код:
While 1
    Sleep(10)
$color=0xE90202
$var=Pixelsearch(150,100,1250,950, $color,1)
if IsArray($var)=1 then ; если нашли
    Sleep(100)
    ToolTip ("    Цель найдена    ",303,0)
    MouseMove($var[0],$var[1],1)
    Send ("1")
    Send ("2")
    Send ("{SPACE 2}")
    Send ("{SPACE 2}")
    MouseClick("left")
	Sleep(10)
ToolTip ("    ОК    ",400,0)
Send ("{SPACE}")
Sleep(10)
MouseUp("left")
;~     For $i=0 To 5 что это делает?
;~     Next
Else
	if IsArray($var)=0 then ; если нет
 $q=1
 Switch $q
	 Case 1
        Sleep (200)
    AutoItSetOption ("MouseClickDelay",300)
    MouseClick ("right",150,150,50)
    ToolTip ('Побежали искать цель ЛЕВОвверх',0,0) ; пришли сюда и ищем
	$q=2
    Case 2
    Sleep(200)
    AutoItSetOption ("MouseClickDelay",300)
    MouseClick ("right",1200,800,50)
    ToolTip ('Побежали искать цель ПРАВОвниз',0,0)
    Sleep (2000)
	$q=1
EndSwitch
EndIf
EndIf
    WEnd
 

sngr

AutoIT Гуру
Сообщения
1,011
Репутация
409
То что ты хочешь невозможно. Тебе надо искать на экране врага, если его нет, на один экран перемещаться скажем влево вверх и опять искать.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
перс должен идти по диагонали, и по дороге увидев моба, остановить цикл ходьбы, и начать бить его (применять скилы и подбирать дроп) когда убил моба, должен так же запускать приостановленный уикл ходьбы и идти дальше...

Ну, я бы вот так сделал

Код:
AdlibRegister ("_mochi_moba", 1000)
OnAutoItExitUnRegister("_mochi_moba")

Func _mochi_moba()
	While _mob_detected()
		; мочи моба
	Wend
EndFunc

Func _mob_detected()
	; проверяем датчики моба
EndFunc

While 1
	; ходи себе по диангонали туда-сюда
WEnd
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
что это дает???
не нашел пояснение этим параметрам...
поясните или дайте ссылку

Если на этом сайте в коде AutoIt навести мышку на библиотечную функцию, то можно перейти к описанию этой функции.
Например http://autoit-script.ru/autoit3_docs/functions/AdlibRegister.htm

В данном коде (Ответ #7) функция _mochi_moba() будет вызываться каждую секунду независимо ни от чего. При вызове зарегистрированной функции прерывается выполнение основной программы. После завершения выполнения зарегистрированной функции работа основной программы возобновляется.

Попутно вопрос к знатокам AutoIt: если зарегистрированно две функции, то вызов первой блокирует вызов остальных? или при вызове первой всё равно выполняется вызов второй и вторая приостанавливает выполнение первой?
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
А зачем тебе две функции регистрировать?
В основной программе ты ходишь туда-сюда, увидел моба - вызвалась функция боя.
Что будет делать вторая функция в регистре?

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

Код:
AdlibRegister ("_Func1", 3000)
OnAutoItExitUnRegister("_Func1")

While 1
    Sleep(100)
    ToolTip("  хожу туда-сюда  ",0,0)
WEnd

Func _Func1()
    Sleep(100)
    ToolTip ("   Если вижу моба, то мочу его   ",50,0)
    Sleep(500)
EndFunc


Что не так?
 

running-frag

why me?
Сообщения
441
Репутация
60
Код:
While 1
    Sleep(100)
    ToolTip("  хожу туда-сюда  ",0,0)
    If _npc_detected () Then _Func1()
WEnd

Func _Func1()
    Sleep(100)
    ToolTip ("   Если вижу моба, то мочу его   ",50,0)
    Sleep(500)
EndFunc


простая последовательность, а в чём проблема то? :smile: функция _npc_detected () проверяет есть ли (после хождения туда-сюда) непись рядом
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
если будет проскакивать во время атаки функция ходьба то перс не сможет подбирать дроп. так как будет убегать от моба. а стоя после 1го удара по мобу ,моб подбегает в упор к персу, и при убийстве его дроп сыпется прям под ноги(при нажатии клавиши подбор,дроп подбирается персом который находится непосредственно под ним)...

Ну почему ж она должна проскакивать?
На, поиграйся капслоком.
Код:
AdlibRegister ("_mochi_moba", 3000)
OnAutoItExitUnRegister("_mochi_moba")

Func _mochi_moba()
	If _npc_detected() Then
		Do
			Sleep(100)
			ToolTip ("  мочу моба   ",50,0)
			Sleep(500)
		Until Not _npc_detected()
		ToolTip ("   подбираю дроп   ",50,0)
		Sleep(500)
	EndIf
EndFunc

Func _npc_detected()
	; проверяем датчики моба. нажатый CapsLock символизирует присутствие моба
	DllCall('user32.dll','int','keybd_event','int',0x14,'int',0,'int',0x02,'ptr',0)
	$STATE=DllCall('user32.dll','int','GetKeyState','int',0x14)
	Return BitAND($STATE[0],1)
EndFunc

While 1
    ; ходи себе по диангонали туда-сюда
	Sleep(100)
    ToolTip("  хожу туда-сюда  ",0,0)
WEnd
 

running-frag

why me?
Сообщения
441
Репутация
60
можно ещё и так
Код:
Func _start ()
	While True
		_walking ()								; переходим дальше
		If _npc_detected () Then _kill_npc()	; если видим нпц убиваем
		If _end () Then Return					; если нужно закочить программу выходим из цикла + функции
		Sleep(1000)								; таймаут между циклами
	WEnd
EndFunc

Func _walking ()
	; тут действия переходов откуда то куда то
EndFunc

Func _npc_detected ()
	; определение нпц рядом
	; возвращает либо True либо False (0\1)
EndFunc

Func _npc_kill ()
    ; действия убийства нпц
EndFunc

Func _end ()
	; тут проверяем выходить ли нам из общего цикла
	; возращает либо True либо False
EndFunc


зы: зачем вы там AdlibRegister суёте? он там обсолютно ненужен

или так
Код:
Func _startEx ()
	_walking ()
	
	If Not (_npc_is_killed ()) Then _kill_npc()
	
EndFunc

Func _walking ()
    ; тут действия переходов откуда то куда то
	; в зависимости от текущих координат идёт либо в один угол, либо в другой
EndFunc

Func _npc_is_killed ()
	; возвращает True либо False
EndFunc
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
зачем вы там AdlibRegister суёте? он там обсолютно ненужен

Ошена ма нушен!!!

Объясняю.

Без использования AdlibRegister ты вынужден функцию _walking() делать на короткие переходы, чтобы сделать паузу для очередной проверки If _npc_detected(). Соответсвенно тебе нужно загромождать код для того чтобы обеспечить хождение по диагонали туда-сюда.

С использованием AdlibRegister ты в навигационном модуле заботишься только о создании ГЛОБАЛЬНОГО маршрута и хождении по нему. То есть ты можешь идти в цикле 10 минут туда и 10 минут обратно.
Код:
While 1
	For $i=1 To 10
		; пошел на северо-восток
		Sleep(60000)
	Next
	For $i=1 To 10
		; пошел на юго-запад
		Sleep(60000)
	Next
WEnd

И всё.
 

running-frag

why me?
Сообщения
441
Репутация
60
C2H5OH [?]
Без использования AdlibRegister ты вынужден функцию _walking() делать на короткие переходы, чтобы сделать паузу для очередной проверки If _npc_detected(). Соответсвенно тебе нужно загромождать код для того чтобы обеспечить хождение по диагонали туда-сюда.

не обязательно короткие, достаточно просто кликнуть конечную точкиу диагонали

ну да, походу мой вариант не совсем подходит под данную тематику
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Ты не можешь параллельно делать и то, и то. Ты сам писал что, если начался бой, то тебе надо остановиться, чтобы после боя поднять дроп.
Если ты не анализируешь своё положение на карте, то тебе, наверное, не подойдет вариант с AdlibRegister. Тебе больше подойдёт вариант фрага
Код:
While True
        _walking ()                             ; ходим
        If _npc_detected () Then _kill_npc()    ; если видим нпц убиваем
        If _end () Then Return                  ; если нужно закочить программу выходим из цикла + функции
        Sleep(1000)                             ; таймаут между циклами
    WEnd

Единственное что тебе не нужно привязываться к минутам, а завести глобальные переменные и учитывать количество перемещений в одну и другую сторону.
Код:
GLOBAL $n=0
GLOBAL $max_n = 30
GLOBAL $step

Func _walking ()
    If $n = 0 Then $step = 1
    If $n = $max_n Then $step = -1
    $n += $step
    If $step = 1 Then
        ; идти на северо-восток
    Else
        ; идти на юго-запад
    EndIf
EndFunc
 

running-frag

why me?
Сообщения
441
Репутация
60
покажи скрины карты или может видео как у тебя там реализовано "хождение" (в игре) потому что не понятно

параллельно запустить две функции не получится, принцеп того же AdLibRegister в том что он останавлиет основной скрипт и выполянет ту функцию что ему задана (но не по середине процесса а под конец, т.е. если скрипт вызван во время передвежения мыши, то он дождётся пока перемещение выполнится, а потом запустится), после основная функция продолжает с того же места

ps: я реально не пойму игровую механику - это нужно видеть, поэтому нужно более конкретное описание


Добавлено:
Сообщение автоматически объединено:

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

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
даже через адреса в памяти и офсеты пытался,не получилось у меня(((
Что конкретно не получилось?
(а после того как значение $Pi исправить ?)
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
http://autoit-script.ru/autoit3_docs/functions/AutoItSetOption.htm#PixelCoordMode

http://autoit-script.ru/autoit3_docs/functions/HWnd.htm
 

Dellroc

Осваивающий
Сообщения
151
Репутация
31
Вот это изучи:
Код:
Opt("PixelCoordMode", 0) ;Отсчет координат пикселей от левого верхнего угла клиентской части окна
Opt("MouseCoordMode", 0) ;Отсчет координат мыши от левого верхнего угла клиентской части окна
Opt('CaretCoordMode', 0)

Передвинуть окно в нужный координаты:
Код:
WinMove
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
JFR сказал(а):
че нормально написать не судьба??
ты поймешь если тебе дадут какое нибудь устройство увиденное тобой впервые, и скажут "сделай то то то..."
я попросил же примеры привести чтобы наглядно видно было...
winmove тащит окно по кордам. а я наоборот хочу, чтобы в любом расположении окна на рабочих столах скрипт адаптировался и коректно работал внутри окна без всяких изменений!....
Глаза разуй и иди хелп читать по всем приведенным выше командам. Тебе дали развернутый ответ как заставить скрипт, работать нормально независимо от положения окна. И пример дали. Или ты хочешь чтобы тебе тут справку цитировали? Разве что добавлю что в параметр $hwnd в командах типа PixelSearch вписывается результат команды. Что собственно тоже становится понятно после прочтения справки.
Код:
WinGetHandle



Добавлено:
Сообщение автоматически объединено:

Ухты, да там еще и на русском всё написано :shok:
 
Статус
Закрыто для дальнейших ответов.
Верх