Что нового

Не могу зациклить Imagesearch до появления изображения

Clou123

Новичок
Сообщения
1
Репутация
0
Приветствую, пытаюсь сделать бота рыболова для игры black desert но столкнулся с проблемой.
Не получается зациклить поиск изображения, до появления оного, т.е. бот видит картинку -> нажимает кнопку, спит 5 сек до пропажи старой и ждет следующую, проблема в том если по истечении 5 секунд не будет этой картинки он не заметит её в будущем.
Кто нибудь знает как это исправить?
Код:
Global $start_part2 = 0
Global $start_part3 = 0
Global $find_img1 = "obj1.bmp"

$X = 0
$Y = 0

Func Start()
	  $Search = _ImageSearch($find_img1 , 0, $X, $Y, 120)
	  If $Search = 1 Then
		 Send("{space}11")
		 Sleep(5000)
		 $start_part2 = 1
	  EndIf
	  If $start_part2 = 1 Then
			   Do
				  $Search = _ImageSearch($find_img1 , 0, $X, $Y, 150)
				  Sleep(500)
			   Until $Search = 1
		 ElseIf $Search = 1 Then
		 Sleep(1000)
		 Send("{space}")
		 $start_part2 = 0
		 $start_part3 = 1
		 EndIf


	  If $start_part3 = 1 Then
		    Do
				  $Search = _ImageSearch($find_img1 , 0, $X, $Y, 150)
				  Sleep(100)
			   Until $Search = 1
		 ElseIf $Search = 1 Then
		 Send("{space}")
		  EndIf
	  EndIf

   EndFunc

   While 1
 Sleep(100)
WEnd


А так же собираюсь после того как разберусь с ботом рыбалки, химичить с ботом на аукцион.
Отталкиваясь от этого вопрос в догонку: кто знает где можно узнать как провести ассоциации допустим 5 вариаций изображения к 1 цифре. В игре простая капчка 50 вариантами цифр(по 5 к каждой). Или стоит попробывать разобратся с http://autoit-script.ru/index.php?topic=11036.0

Пример с чем буду работать:
2cmxfo2.jpg
1c229fa71b16.png

местоположение цифр меняется (лево,право) но не выходит из определённых областей.Так же цвет цифр не меняется.
 

Yura

Знающий
Сообщения
36
Репутация
7
Отступы сначала нормально проставьте, эту кашу читать невозможно. И комментарии, чтоб люди не угадывали что вы где хотите сделать.

Код:
Global $start_part2 = 0
Global $start_part3 = 0
Global $find_img1 = "obj1.bmp"

$X = 0
$Y = 0

Func Start()
	$Search = _ImageSearch($find_img1 , 0, $X, $Y, 120)
	
    If $Search = 1 Then
		Send("{space}11")
        Sleep(5000)
        $start_part2 = 1
	EndIf
	
	If $start_part2 = 1 Then
        Do
            $Search = _ImageSearch($find_img1 , 0, $X, $Y, 150)
            Sleep(500)
        Until $Search = 1
    ElseIf $Search = 1 Then
        Sleep(1000)
        Send("{space}")
        $start_part2 = 0
        $start_part3 = 1
    EndIf


    If $start_part3 = 1 Then
        Do
            $Search = _ImageSearch($find_img1 , 0, $X, $Y, 150)
            Sleep(100)
        Until $Search = 1
    ElseIf $Search = 1 Then
		Send("{space}")
   	EndIf
    
	EndIf ;?????????????????????

EndFunc

While 1
	Sleep(100)
WEnd


Вот так должен выглядеть код, чтоб там можно было что-то разобрать. Сразу видно, что лишний Elself, скопировали что-то не то.
Во вторых в вашем коде функция Start() нигде не вызывается.

Этот кусок внимательно:
Код:
If $start_part2 = 1 Then
        Do                   
            $Search = _ImageSearch($find_img1 , 0, $X, $Y, 150)
            Sleep(500)
        Until $Search = 1
    ElseIf $Search = 1 Then
        Sleep(1000)
        Send("{space}")
        $start_part2 = 0
        $start_part3 = 1
    EndIf

Что вы здесь делаете? Вы ищете изображение в цикле пока оно не появится. А когда оно появилось, что вы делаете? Вы не делаете ничего, дальше у вас ElseIf, в который вы не заходите. Вы выходите из условия If, а дальше и из функции ничего не нажав. Ниже это еще раз дублируется. Если я правильно понял то, что вы хотите сделать (комментариев то нет), то картинка у вас находится, но пробел не нажимается.

$start_part2 = 1 и подобные переменные и кучу лишних условий тоже незачем плодить. Если не можете в уме представить, то нарисуйте на бумаге блок-схему вашей функции, почитайте о выходе с функции через Return. Если правильно понял, что вы хотите сделать, тов ваш код можно написать намного проще и надежнее:
Код:
#include "ImageSearch.au3"

Global Const $find_img1 = "obj1.bmp"
Global $X = 0
Global $Y = 0

HotKeySet("{ESC}", "_End") ;выход с программы по нажатию ESC

Func _End()
    Exit
EndFunc

While 1
	_Start()
	Sleep(100)
WEnd

Func _Start()
	For $i = 1 To 3  ; 3 раза ищем одну и ту же картинку
		$timer = TimerInit()
		While 1
			If(TimerDiff($timer)>10000) Then Return ; не нашли за 10 с - выходим из функции, чтоб не попасть в вечный цикл
			If _ImageSearch($find_img1 , 0, $X, $Y, 150) == 1 Then
				Send("{space}")	;жмем пробел, когда нашли картинку
				ConsoleWrite("Send space number: " & $i & @CR) ;пишем в консоль просто для контроля

				If $i == 1 Then
					 Sleep(5000)
				ElseIf $i == 2 Then
					Sleep(500)
				Else
					Sleep(100)
				EndIf

				ExitLoop ;идем искать следующую картинку
			Else
				Sleep(100) ;если не нашли- ждем и разгружаем процессор
			EndIf
		WEnd
	Next
EndFunc

Так функция Старт будет искать картинку, нашла - жмет пробел и ждет 5с, опять ищет пока не появится - нашла - жмет пробел и ждет 500мс, опять ищет - нашла -пробел и ждет 100мс.

Наверняка можно сделать еще рациональнее, чтоб не задавать время сна - 5с или 500мс, а просто нажать пробел когда картинка появилась и дальше проверять ее наличие не нажимая ничего. Когда исчезнет и опять потом появится- снова нажать пробел. А функцию повесить через AdlibRegister:
Код:
#include "ImageSearch.au3"

Global Const $find_img1 = "obj1.bmp"
Global $X = 0
Global $Y = 0
Global $flag_img = True ;если еще не нажали по картинке - true, нажали 1 раз - false

HotKeySet("{ESC}", "_End") ;выход с программы по нажатию ESC

AdlibRegister("_Start", 100) ;каждые 100 мс вызываем функцию _Start()

While 1
	Sleep(10000 )
WEnd

Func _Start()
	If _ImageSearch($find_img1 , 0, $X, $Y, 150) == 1 Then
		If $flag_img Then
			Send("{space}")	;жмем пробел, когда нашли картинку и еще по ней не нажимали
			$flag_img = False
			ConsoleWrite("Send space" & @CR) ;пишем в консоль просто для контроля
		EndIf 
	Else
		$flag_img = True ;картинка пропала- ставим флаг True- можно опять нажимать, когда появится
	EndIf
EndFunc

Func _End()
    Exit
EndFunc

Вся функция меньше 10 строк получается и она будет работать надежно.

150 - это огромное отклонение по цвету, может такого не надо? таким отклонением вы заставляете проверять очень много пикселей и грузите лишний раз проц. почти наверняка до 10, а то и 0 будет работать.

И как пожелание - если можно сделать так, чтоб бот не мешал работать за компом, то лучше это сделать. У вас картинку ищет с экрана, а значит ваша игрушка должна быть постоянно видимой - не хорошо.
http://autoit-script.ru/index.php?topic=21444.0
буквально сегодня выложил пример, как искать картинку в перекрытом и задвинутым за границы экрана окне. Если можно - попробуйте искать в окне, а кнопки жать через ControlSend.
 

codeemisswealth1988bit

Новичок
Сообщения
1
Репутация
0
Не получается просматривать изображения. При нажатии на картинки появляется ошибка "вы не имеете прав для доступа к этой странице".???
 
Верх