Что нового

[Автоматизация] Запуск Елсе, если меняется цвет пикселя.

kolosov

Новичок
Сообщения
137
Репутация
0
Здравствуйте. У меня есть проблема в написании бота , и решил спросить совета у более опытных.
Дело в том что, пишу бота и наткнулся на токую проблему. Хотел сделать так , что если на указаной точки экрана изменится цвет, то программа выполняла Else.
Должно было работать так:
1)Указываешь цвет.
2)Указываешь кнопки
3)Если цвет не меняется, бот просто проверяет постояно его.
4)Если цвет изменился запускается Else.
А у меня. Работает не так
1)Указываю цвет.
2)Указываю кнопки.
3)Если цвет не меняется ,БОТ ЗАПУСКАЕТ ELSE
4)Если цвет изменился, БОТ ЗАПУСКАЕТ ELSE.
Тоесть ELSE запускает в обоих случаях, что не допустимо.

Помогите пожалуйсто решить эту проблему.

Также вот скрипт (Эту функцию я писал отдельно, чтобы тело скрипта не тупило.)

Код:
Global $ExitWorks [2]= [0,0]
Global $Resource [2]= [0,0]
Global $Mine [2]= [0,0]
Global $Occupation [2]= [0,0]
Global $Cvet0001[2] = [0,0]

GUICreate("Настройка",200,200)
AutoItSetOption('GUIOnEventMode',1)
Global $Start = GUICtrlCreateButton("Старт",10,30)
GUICtrlSetOnEvent($Start,'_Cvet')
$NoWorks = GUICtrlCreateButton("Настройка",40,30)
GUICtrlSetOnEvent($NoWorks,'_NoWorks')
Read6()
GUISetState()

Func _NoWorks()
   MsgBox(1,"Настройка","***********")
   Sleep(2000)
   $Cvet0001 = MouseGetPos()
   MsgBox(0,"Настройка","Выполнено",1)
   IniWrite('Setting.ini','Setting','NoRes >X',$Cvet0001  [0])
   IniWrite('Setting.ini','Setting','NoRes >Y',$Cvet0001  [1])
   
   MsgBox(0,"Настройка","***********")
   Sleep(2000)
   $ExitWorks = MouseGetPos()
   MsgBox(0,"Настройка","Выполнено",1)
   IniWrite('Setting.ini','Setting','ExitWorks >X',$ExitWorks  [0])
   IniWrite('Setting.ini','Setting','ExitWorks >Y',$ExitWorks  [1])
   
   MsgBox(0,"Настройка","***********")
   Sleep(2000)
   $Resource = MouseGetPos()
   MsgBox(0,"Настройка","Выполнено",1)
   IniWrite('Setting.ini','Setting','Resource >X',$Resource  [0])
   IniWrite('Setting.ini','Setting','Resource >Y',$Resource  [1])
   
   MsgBox(0,"Настройка","***********")
   Sleep(2000)
   $Mine = MouseGetPos()
   MsgBox(0,"Настройка","Выполнено",1)
   IniWrite('Setting.ini','Setting','Mine >X',$Mine  [0])
   IniWrite('Setting.ini','Setting','Mine >Y',$Mine  [1])
   
   MsgBox(0,"Настройка","***********")
   Sleep(2000)
   $Occupation = MouseGetPos()
   MsgBox(0,"Настройка","Выполнено",1)
   IniWrite('Setting.ini','Setting','Occupation >X',$Occupation  [0])
   IniWrite('Setting.ini','Setting','Occupation >Y',$Occupation  [1])
EndFunc

Func Read6()
   $ExitWorks[0] = IniRead("Setting.ini","Setting","ExitWorks >X","0")
   $ExitWorks[1] = IniRead("Setting.ini","Setting","ExitWorks >Y","0")
   $Resource[0] = IniRead("Setting.ini","Setting","$Resource >X","0")
   $Resource[1] = IniRead("Setting.ini","Setting","$Resource >Y","0")
   $Mine[0] = IniRead("Setting.ini","Setting","$Mine >X","0")
   $Mine[1] = IniRead("Setting.ini","Setting","$Mine >Y","0")
   $Occupation[0] = IniRead("Setting.ini","Setting","$Occupation >X","0")
   $Occupation[1] = IniRead("Setting.ini","Setting","$Occupation >Y","0")
   $Cvet0001[0] = IniRead("Setting.ini","Setting","$Cvet0001 >X","0")
   $Cvet0001[1] = IniRead("Setting.ini","Setting","$Cvet0001 >Y","0")
   $Cvet0002 = PixelGetColor($Cvet0001[0],$Cvet0001[1])
EndFunc

Func _Cvet()
Sleep(1500)   
If $Cvet0002 <> PixelGetColor($Cvet0001[0],$Cvet0001[1]) Then   
MouseClick('left',$ExitWorks[0], $ExitWorks[1])   
Sleep(1000)
MouseClick('left',$Resource[0], $Resource[1])
Sleep(1000)
MouseClick('left',$Mine[0], $Mine[1])
Sleep(1000)
MouseClick('left',$Occupation[0], $Occupation[1])
$Cvet0002 = PixelGetColor($Cvet0001[0],$Cvet0001[1])
EndIf 
   EndFunc
   
   
While 1
    Sleep(100)
Wend


Надеюсь на вашу помощь.


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

Не кто не может помочь?
 

Astel064

Помог мой пост, ставь +!
Сообщения
276
Репутация
51
Стас, я вижу, что ты так и не смотрел мой скрипт, который я тебе писал, я так и не понял, он не работает, или что???
 
Автор
K

kolosov

Новичок
Сообщения
137
Репутация
0
Я сматрел твой скрипт с примерами использовани данной функции. Но я так и не разобрался с ней.Из за того что я там не магу уловить мысль как это работает.
 

Astel064

Помог мой пост, ставь +!
Сообщения
276
Репутация
51
Хорошо, я сейчас прокомментирую скрипт :smile:


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

Настраиваемый скрипт, если захотеть его понять.

Код:
$ColorExistFuncName = "iColorExist"; Название функции, которая будет выполняться, если цвет НЕ изменился (можно не указывать, поставив "")
$NewColorFuncName = "iNewColor"; Название функции, которая будет выполняться, если цвет ИЗМЕНИЛСЯ (можно не указывать, поставив "")
	$NewColorString = 0; После того, как появился новый цвет - его можно будет получить из этой переменной
	$color = 0; После того, как появился новый цвет - старый цвет можно будет получить из этой переменной
$Sleep = 1000; Промежуток времени (в мсек.) между проверками пикселя
$STOP_PixelGetColor = 0; Если во время работы этого скрипта присвоить $STOP_PixelGetColor = 1, то поиск цвета прервется (но лучше используй функцию ниже, чтобы не запутаться)
; Также, если выполнить функцию STOP_PixelGetColorWhile() , то поиск цвета прервется




Func STOP_PixelGetColorWhile() ; Функция, при вызове которой скрипт прерывает выполнение поиска (сделал толькол для того, чтобы ты не путался)
$STOP_PixelGetColor = 1 ; Если $STOP_PixelGetColor = 1 то поиск прерывается
EndFunc ; Конец функции STOP_PixelGetColorWhile


Func NEXT_PixelGetColorWhile() ; Когда скрипт находит, что цвет пикселя экрана изменился, то он будет выдавать каждую секунду сообщение, что цвет поменялся. Если вызвать эту функцию (см. где она вызывается), то скрипт повторно запомнит цвет указанного тобой пикселя (новый цвет запомнит) и начнет проверку: не изменился-ли НОВЫЙ цвет на другой.
$color = $NewColorString ; Ну и эта функция только для простоты
EndFunc ; Конец функции NEXT_PixelGetColorWhile



Dim $iMsgBoxAnswer ; Сообщение (кнопки: ОК = 1, Отмена = 2)
$iMsgBoxAnswer = MsgBox(65," ","Наведите курсор на нужный пиксель и нажмите Enter")
Select
   Case $iMsgBoxAnswer = 2
	MsgBox(64," ","Отменено")
	Exit
EndSelect ; Конец сообщения


Local const $pos = MouseGetPos() ; Запоминаем текущщие координаты мыши в переменную (массив) $pos (переменная больше не меняет свое значение)
$color = PixelGetColor ( $pos[0], $pos[1] ) ; Запоминает цвет пикселя, ориентируясь на координаты из $pos . Далее скрипт сравнивает цвет пикселя с этим образцом. А когда находит новый цвет на запомненном ранее пикселе, то с помощью функции NEXT_PixelGetColorWhile сделать найденный цвет образцом, чтобы продолжить сравнение (поиск изменений).


Dim $iMsgBoxAnswer ; Сообщение (конечное подтверждение пользователя)
$iMsgBoxAnswer = MsgBox(52," ","Полученный результат:" & @CRLF & "" & @CRLF & "Координата X экрана: "&$pos[0]&"" & @CRLF & "Координата Y экрана: "&$pos[1]&"" & @CRLF & "Значение цвета на указанном пересечении координат: "&$color&"" & @CRLF & "" & @CRLF & "Начать проверку цвета на указанном пересечении?")
Select
   Case $iMsgBoxAnswer = 7
	MsgBox(64," ","Отменено")
	Exit
EndSelect ; Конец сообщения (кнопки такие-же, как и в 1-ом сообщении)



While 1 ; Цикл поиска нацинается ТУТ!
$NewColorString = PixelGetColor ( $pos[0], $pos[1] ) ; Получаем цвет пикселя, риентируясь на координаты, записанные РАНЕЕ в $pos
	If $color <> $NewColorString Then ; Сравнивает, отличается ли цвет (смотри выше, где устанавливается переменная $color и что это такое)
	If $NewColorFuncName <> "" Then Call ( $NewColorFuncName ) ; Если цвет действительно ИЗМЕНИЛСЯ, то вызывается функция (указана в самом начале скрипта в переменную $NewColorFuncName). Эти фуцкции только для примера, эту строку можно заменять другим кодом!
	Else
	If $ColorExistFuncName <> "" Then Call ( $ColorExistFuncName ) ; Если цвет НЕ изменился, то вызывается функция (указана в самом начале скрипта в переменную $ColorExistFuncName). Эти фуцкции только для примера, эту строку можно заменять другим кодом!
	EndIF ; Конец условия
Sleep ($Sleep) ; Пауза, во избежании нагрузки (пауза указывается в миллисекундах и снова-же, в самом начале скрипта)
If $STOP_PixelGetColor <> 0 Then ExitLoop ; Это прерывает цикл поиска в том случае, если ты вызывал функцию STOP_PixelGetColorWhile
Wend ; А ТУТ цикл поиска заканчивается!!!

MsgBox(48," ","Функция завершена!") ; Если цикл поиска прерывается, то ты увидешь это сообщение!
Exit ; Выход!











Func iNewColor() ; Функция, выполняемая тогда, когда цвет ИЗМЕНИЛСЯ
TrayTip("PixelGetColorWhile", "Цвет выбранного пикселя изменился!"&@CRLF&"Старый цвет: "&$color&@CRLF&"Новый цвет: "&$NewColorString, 5, 4) ; Оповещение из значка трея, что цвет изменился
MsgBox(48," ","Цвет изменился!") ; Оповещение сообщением, что цвет изменился
STOP_PixelGetColorWhile(); Это прервет весь этот пример, если цвет ОДИН раз изменится! Закомментируй эту строку, чтобы не прерывать цикл сравнивания цвета.
; NEXT_PixelGetColorWhile(); Разкомментируй эту строку, чтобы начать сравнение с новым (найденным цветом), иначе скрипт будет вызывать эту функцию (считая, что он нашел новый цвет) повторно, пока цвет не станет прежним. Разкомментируй в том случае, если STOP_PixelGetColorWhile() закомментировано.
EndFunc ; Конец функции iNewColor

Func iColorExist() ; Функция, выполняемая тогда, когда цвет НЕ изменился
TrayTip("", "Цвет не менялся: "&$color, 5, 4) ; Оповещение из значка трея, что цвет НЕ изменился
EndFunc ; Конец функции iColorExist



Самый наилегчайший пример, что тебе нужно:
Код:
Dim $iMsgBoxAnswer ; Сообщение (кнопки: ОК = 1, Отмена = 2)
$iMsgBoxAnswer = MsgBox(65," ","Наведите курсор на нужный пиксель и нажмите Enter")
Select
   Case $iMsgBoxAnswer = 2
	MsgBox(64," ","Отменено")
	Exit
EndSelect ; Конец сообщения


Local const $pos = MouseGetPos() ; Запоминаем текущщие координаты мыши в переменную (массив) $pos (переменная больше не меняет свое значение)
$color = PixelGetColor ( $pos[0], $pos[1] ) ; Запоминает цвет пикселя, ориентируясь на координаты из $pos . Далее скрипт сравнивает цвет пикселя с этим образцом. А когда находит новый цвет на запомненном ранее пикселе, то с помощью функции NEXT_PixelGetColorWhile сделать найденный цвет образцом, чтобы продолжить сравнение (поиск изменений).


Dim $iMsgBoxAnswer ; Сообщение (конечное подтверждение пользователя)
$iMsgBoxAnswer = MsgBox(52," ","Полученный результат:" & @CRLF & "" & @CRLF & "Координата X экрана: "&$pos[0]&"" & @CRLF & "Координата Y экрана: "&$pos[1]&"" & @CRLF & "Значение цвета на указанном пересечении координат: "&$color&"" & @CRLF & "" & @CRLF & "Начать проверку цвета на указанном пересечении?")
Select
   Case $iMsgBoxAnswer = 7
	MsgBox(64," ","Отменено")
	Exit
EndSelect ; Конец сообщения (кнопки такие-же, как и в 1-ом сообщении)



While 1 ; Цикл поиска нацинается ТУТ!
$NewColorString = PixelGetColor ( $pos[0], $pos[1] ) ; Получаем цвет пикселя, риентируясь на координаты, записанные РАНЕЕ в $pos
	If $color <> $NewColorString Then ; Сравнивает, отличается ли цвет (смотри выше, где устанавливается переменная $color и что это такое)
	TrayTip("Браво", "Цвет изменился!", 5, 1)
	ExitLoop ; Прерывание цикла поиска как только скрипт ОДИН раз найдет изменение цвета указанного пикселя
	Else
	TrayTip("Увы", "Ничего не менялось...", 5, 4)
	EndIF ; Конец условия
Sleep (100) ; Пауза, во избежании нагрузки (пауза указывается в миллисекундах)
Wend ; А ТУТ цикл поиска заканчивается!!!

MsgBox(48," ","Функция завершена!") ; Если цикл поиска прерывается, то ты увидешь это сообщение!
Exit ; Выход!


Стас, а теперь ответь, ты вообще пробовал запускать первый пример? (лично я его тебе скидывал 2 раза, это третий, но расписанный)
 
Автор
K

kolosov

Новичок
Сообщения
137
Репутация
0
Да. Я пытался сам понять что да как было в тех примерах что ты мне скидывал. Но из за того что там были только функции, а фиг его знал что для чего написано. Щяс буду разберать расписаный пример, тут проще. Спасибо
 
Верх