Что нового

Поиск пикселя - нажатие, поиск пикселя - ошибка

jufas222

Знающий
Сообщения
93
Репутация
5
Версия AutoIt: v3

Описание: Игра Plants vs. Zombie, в ней есть мини игра, собственно для неё и нужен скрипт.
Скрипт должен всегда следовать за улиткой и кликать на неё, через заданное мной время "погоня" за улиткой прекрощается, и должна наступить функция, в функцию заключается поиск цвета (распылителя на картинке) и клик по нему, затем следует поиск другого цвета (цветка над которым висит картинка распылителя) и клик по этому распылителю (на цветке который).
Всё проходит хорошо, скрипт работает до тех пор, пока цветки не перестанут нуждатся в распылителе, после того вылетает ошибка...

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

Вот скриншот с игры: http://s019.radikal.ru/i626/1206/f7/5f7fac66b48f.jpg





Код:
HotKeySet ("{F1}",   "_script_togglePause")
HotKeySet ("{F2}","_exit")

Global $stSettings[1] = [False]
Func _script_togglePause ()
    $stSettings[0] = Not ($stSettings[0])
    If $stSettings[0] Then ToolTip (". . . pause . . .", @DesktopWidth/2, 100)
    While $stSettings[0]
        Sleep (100)
    WEnd
    ToolTip ("")
EndFunc

Func _exit()
    Exit
EndFunc

AdlibRegister('poliv', 1*60*1000)
AdlibRegister('musik', 3*60*1000)



WinWaitActive ("Plants vs. Zombies")

While 1
	$aCoord=PixelSearch( 557, 35, 1356, 628, 0xBD8140 )
If Not @error Then
    MouseClick('left', $aCoord[0], $aCoord[1], 3,25)
EndIf
	WEnd






Func poliv()
 $aCoord=PixelSearch( 557, 35, 1356, 628, 0x9DD170 )   ; находит цвет
 If Not @error Then
    MouseClick('left', $aCoord[0], $aCoord[1], 1)    ;;кликает
	Sleep (2000)
	$aCoord=PixelSearch( 557, 35, 1356, 628, 0x487825 )  ; если цвет не находит, то вылетает ошибка и скрипт останавливается
	MouseClick('left', $aCoord[0], $aCoord[1], 1)
EndIf
EndFunc



Func musik()
	$aCoord=PixelSearch( 557, 35, 1356, 628, 0xEDB139 )
 If Not @error Then
    MouseClick('left', $aCoord[0], $aCoord[1], 1)
	Sleep (2000)
	$aCoord=PixelSearch( 557, 35, 1356, 628, 0xF6B739 )
	MouseClick('left', $aCoord[0], $aCoord[1], 1)
EndIf
EndFunc
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Наверно как-то так:
Код:
Func poliv()
 $aCoord=PixelSearch( 557, 35, 1356, 628, 0x9DD170 )   ; находит цвет
 If Not @error Then
    MouseClick('left', $aCoord[0], $aCoord[1], 1)    ;;кликает
    Sleep (2000)
    $aCoord=PixelSearch( 557, 35, 1356, 628, 0x487825 )  ; если цвет не находит, то вылетает ошибка и скрипт останавливается
     If @error Then ;если ошибка, тогда сообщить и выйти
		 MsgBox(16, "Ошибка", "Программа выполнила недопустимую ошибку и будет закрыта")
		 Exit
	 EndIf	 
	MouseClick('left', $aCoord[0], $aCoord[1], 1)
EndIf
EndFunc
 
Автор
J

jufas222

Знающий
Сообщения
93
Репутация
5
Ваш скрипт, если не находит цвет выдаёт ошибку и закрывается, а надо что бы кликнул по тому же месту где и находится, и продолжил выполнять другую функцию....
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Так попробуй
Код:
Func poliv()
 $aCoord_1=PixelSearch( 557, 35, 1356, 628, 0x9DD170 )   ; находит цвет
	If Not @error Then
		MouseClick('left', $aCoord_1[0], $aCoord_1[1], 1)    ;;кликает
		Sleep (2000)
		$aCoord_2=PixelSearch( 557, 35, 1356, 628, 0x487825 )  ; если цвет не находит, то вылетает ошибка и скрипт останавливается
		If @error Then ;если ошибка, тогда кликнуть по координатам из первого массива         
			MouseClick('left', $aCoord_1[0], $aCoord_1[1], 1)         	 
		EndIf       
	EndIf
EndFunc
 
Автор
J

jufas222

Знающий
Сообщения
93
Репутация
5
Спасибо, работает, но я немного не понял и проверить сейчас не могу, если нужный нам цвет он не находит он кликает по тому же самому месту, но, а если находит, то что произойдёт??? ведь клик не задан....задан клик только с первого массива при не обнаружении цвета...
Обьясните пожалуйста.....может я что то не так понял...


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

Код:
Func poliv()
 $aCoord_1=PixelSearch( 557, 35, 1356, 628, 0x9DD170 )   ; находит цвет
    If Not @error Then
        MouseClick('left', $aCoord_1[0], $aCoord_1[1], 1)    ;;кликает
        Sleep (2000)
        $aCoord_2=PixelSearch( 557, 35, 1356, 628, 0x487825 )  ; если цвет не находит, то вылетает ошибка и скрипт останавливается
        If @error Then ;если ошибка, тогда кликнуть по координатам из первого массива
            MouseClick('left', $aCoord_1[0], $aCoord_1[1], 5)
			If Not @error Then     ;если ошибки нет, то клик по координатам из второго массива.
				MouseClick('left',$aCoord_2[0], $aCoord_2[1], 5)
			EndIf
        EndIf
    EndIf
EndFunc





Возможно, что это будет работать???


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

Не заметил сразу ошибку....Но я не знаю что это за ошибка =\


Ошибка на строке, которую я сам попытался добавить.

Код:
MouseClick('left',$aCoord_2[0], $aCoord_2[1], 5)


C:\Users\User\Desktop\proverka poliva.au3 (10) : ==> Subscript used with non-Array variable.:
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Попробуй так
Код:
Func poliv()
 $aCoord_1=PixelSearch( 557, 35, 1356, 628, 0x9DD170 )   ; находит цвет
    If Not @error Then
        MouseClick('left', $aCoord_1[0], $aCoord_1[1], 1)    ;;кликает
        Sleep (2000)
        $aCoord_2=PixelSearch( 557, 35, 1356, 628, 0x487825 )  ; если цвет не находит, то вылетает ошибка и скрипт останавливается
        If @error Then ;если ошибка, тогда кликнуть по координатам из первого массива
            MouseClick('left', $aCoord_1[0], $aCoord_1[1], 5)
            Else    ;если ошибки нет, то клик по координатам из второго массива.
                MouseClick('left',$aCoord_2[0], $aCoord_2[1], 5)            
        EndIf
    EndIf
EndFunc
 
Автор
J

jufas222

Знающий
Сообщения
93
Репутация
5
Вот этот скрит работает как надо, но я упустил ещё 1 проблему...
Смотрите коментарии в скрипте.
P.S. я хотел доделать скрипт по вашему образцу, но я не пойму что означает Еlse (справка не помогла), вы бы не могли по подробней описать действие Else.



Код:
Func poliv()
 $aCoord_1=PixelSearch( 557, 35, 1356, 628, 0x9DD170 )  
    If Not @error Then
        MouseClick('left', $aCoord_1[0], $aCoord_1[1], 1)    
		;если цвет не находит кликает по другому цвету (а лучше координатам), будет 4 действия: зайти в магазин - нажать на товар - подтвердить покупку - нажать на выход из магазина
		
        Sleep (2000)
        $aCoord_2=PixelSearch( 557, 35, 1356, 628, 0x487825 )  
        If @error Then 
            MouseClick('left', $aCoord_1[0], $aCoord_1[1], 5)
            Else 
                MouseClick('left',$aCoord_2[0], $aCoord_2[1], 5)
        EndIf
    EndIf
EndFunc




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

Не дожидаясь вашей помощи, попробовал сделать сам, по вашему примеру, но у меня естественно не чего не вышло :smile:


Код:
Func poliv()
	Sleep(2000)
 $aCoord_1=PixelSearch( 557, 35, 1356, 628, 0x10EFD9 )   ; находит цвет
    Sleep(2000)
	If @error Then
	      MouseClick('left',1265,100,1,25) ; если ошибка(цвет не найден), то кликает по координатам.
	Else
		  MouseClick('left',$aCoord_1[0], $aCoord_1[0], 1)    ;кликает если цвет найден, по координатам цвета пикселя из первого массива, тут выдаёт ошибку :   C:\Users\user\Desktop\ghjdthrf hfccflf.au3 (28) : ==> Subscript used with non-Array variable.:

		Sleep (2000)
        $aCoord_2=PixelSearch( 557, 35, 1356, 628, 0x487825 )  ; ищет цвет
        If @error Then ;если ошибка, тогда кликнуть по координатам из первого массива
            MouseClick('left', $aCoord_1[0], $aCoord_1[1], 5)
            Else    ;если ошибки нет, то клик по координатам из второго массива.
                MouseClick('left',$aCoord_2[0], $aCoord_2[1], 5)
        EndIf
    EndIf
EndFunc



На строке
Код:
MouseClick('left',1265,100,1,25) ; если ошибка(цвет не найден), то кликает по координатам.
не чего, не происходит (а должен быть клик, так как такого цвета нет в данной игре (цвет не с игры спецально сделал, что бы проверить работуспособность)).


А вот на строке
Код:
MouseClick('left',$aCoord_1[0], $aCoord_1[0], 1)

Вылетает ошибка: C:\Users\user\Desktop\ghjdthrf hfccflf.au3 (28) : ==> Subscript used with non-Array variable.:


Я с нетерпением жду помощи, помимо "перерывая" форум в поиске подобных тем, проблем....
 

nowost

Знающий
Сообщения
178
Репутация
17
попробуй потестить начиная от простого, работает ли такой вариант?
Код:
while 1
sleep(100)
$aCoord_1=PixelSearch( 557, 35, 1356, 628, 0x9DD170 ) 
 If @error Then
 MouseClick('left',1265,100,1,1)
endif
wend
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
jufas222
что означает Еlse
Может так понятней будет:
Код:
If(Если) (условие) Then(Тогда)
	(условие выполнилось и делаем одно)
Else(Иначе)
	(условие не выполнилось и делаем другое)
EndIf(КонецЕсли)


P/S:
не чего, не происходит (а должен быть клик, ...)
Правильно, ведь ошибка вылетает на строке
Код:
MouseClick('left',$aCoord_1[0], $aCoord_1[0], 1)

Subscript used with non-Array variable
А вылетает потому, что изначально в $aCoord_1 пусто (не нашел цвет),
т.е. нет массива $aCoord_1[0]. Надо менять логику скрипта.
 
Автор
J

jufas222

Знающий
Сообщения
93
Репутация
5
Yuriy [?]
Может так понятней будет:
Спасибо, но я поискав темы с подобным скриптом разобрался что означает
Код:
Else


Я разобрался со скриптом, сейчас он выглядет вот так:
Код:
Func raspilitel()
	Opt("PixelCoordMode", 2)
		Opt("MouseCoordMode", 2)
	 Sleep(2000)
		$c = PixelGetColor(178, 45)


if $c = 0x62973A then
$cc = 1
Else
$cc = 0
EndIf
Sleep(1000)
if $cc = 1 then
MouseClick('left',177,47,1,5)
Else
	MouseClick('left',725, 57,1,5)
	Sleep(1000)
	MouseClick('left',473, 362,1,5)
	Sleep(500)
	MouseClick('left',302, 399,1,5)
	Sleep(500)
	MouseClick('left',429, 552,1,5)
  EndIf

  $aCoord_12=PixelSearch( 5, 6, 795, 540, 0x75A04E)
If @error Then
     MouseClick('left',177,44,1,5)
 Else
	 sleep (3000)
	 MouseClick('left',$aCoord_12[0],$aCoord_12[1],1)
 EndIf




 Opt("PixelCoordMode", 2)
		Opt("MouseCoordMode", 2)
	 Sleep(2000)
		$c = PixelGetColor(178, 45)


if $c = 0x62973A then
$cc = 1
Else
$cc = 0
EndIf
Sleep(1000)
if $cc = 1 then
MouseClick('left',177,47,1,5)
Else
	MouseClick('left',725, 57,1,5)
	Sleep(1000)
	MouseClick('left',473, 362,1,5)
	Sleep(500)
	MouseClick('left',302, 399,1,5)
	Sleep(500)
	MouseClick('left',429, 552,1,5)
  EndIf

  $aCoord_13=PixelSearch( 5, 6, 795, 540, 0x75A04E)
If @error Then
     MouseClick('left',177,44,1,5)
 Else
	 sleep (3000)
	 MouseClick('left',$aCoord_13[0],$aCoord_13[1],1)
 EndIf







 Opt("PixelCoordMode", 2)
		Opt("MouseCoordMode", 2)
	 Sleep(2000)
		$c = PixelGetColor(178, 45)


if $c = 0x62973A then
$cc = 1
Else
$cc = 0
EndIf
Sleep(1000)
if $cc = 1 then
MouseClick('left',177,47,1,5)
Else
	MouseClick('left',725, 57,1,5)
	Sleep(1000)
	MouseClick('left',473, 362,1,5)
	Sleep(500)
	MouseClick('left',302, 399,1,5)
	Sleep(500)
	MouseClick('left',429, 552,1,5)
  EndIf

  $aCoord_14=PixelSearch( 5, 6, 795, 540, 0x75A04E)
If @error Then
     MouseClick('left',177,44,1,5)
 Else
	 sleep (3000)
	 MouseClick('left',$aCoord_14[0],$aCoord_14[1],1)
 EndIf








 EndFunc



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

P.S. В нём одни и те жи действия, а я не могу задать нужное количество повторов для функции, по этому и создал тему http://autoit-script.ru/index.php/topic,10312.0.html
Посетите её, возможно именно вы поможите мне :smile:
 
Верх