Что нового

[Автоматизация] Бот(Наведение мыши на определенный цвет)

Vaffl9

Новичок
Сообщения
8
Репутация
1
Доброго времени суток, я недавно начал заниматься программированием вернее сегодня, и еще не всего знаю, у меня такой вопрос как реализовать наведение мыши на определенный цвет в определенном месте на экране(Прямоугольник), и в добавок если рядом с ним значок желтого цвета, то он бы игнорировал данную точку и переместился к следующий или подождал бы ее появления.
Бот для автоматизированного боя в игре "Двар"

У меня получилось только навести на цвет и кликнуть туды и ожидание точки если таковой нету в данный момент, но игнор если желтый не получается, подскажите пожалуйста в чем проблема?



Код:
While 1
$coord = PixelSearch( 180, 215, 820, 470, 0xFF6347, 6, 2)
   If Not @error then
	WinClose("X и Y равны:", "x ,y")
	MouseMove( $coord [0], $coord [1] , 0 )
	MouseClick ( "",$coord[0], $coord[1], 2, 0 )
	return
    If not @error Then
	   $CoordI = PixelSearch( $coord[0] -5, $coord[1]+5, 0xFFA500 ,5, 2)
	return
	EndIf
   EndIf
Wend
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Re: Бот(Наведение мыши на определенный цвет)

Уважаемая Вафля, для того чтобы успешно программировать, рекомендую прочитать правила раздела и правила форума, раз по 100 каждое, вдумчиво. Иначе карьера программиста так и будет завершена, даже не начавшись.
Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Модератор.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Проблема в том что ты никакой желтый цвет не проверяешь.
Ты нашел точку нужного цвета и кликнул по ней
Код:
$coord = PixelSearch( 180, 215, 820, 470, 0xFF6347, 6, 2)
   If Not @error then
    MouseMove( $coord [0], $coord [1] , 0 )
    MouseClick ( "",$coord[0], $coord[1], 2, 0 )


И всё...
 
Автор
V

Vaffl9

Новичок
Сообщения
8
Репутация
1
А мне тут смотри как сделать надо, вот программа нашла точку(1), и если возле этой точки(1) есть желтая точка(2) то объект игнорировать и перейти к следующей точке(1)

это кстати все та же программа с который ты мне помог, только я ее доработал, так что можно смотреть все по тому же примеру
Код:
while 1
   While 1
$coord = PixelSearch( 180, 215, 820, 470, 0xFF6347, 6, 2)
If Not @error then
	WinClose("X и Y равны:", "x ,y")
	MouseMove( $coord [0], $coord [1] , 0 )
   MouseClick ( "",$coord[0], $coord[1], 2, 0 )
   ExitLoop
   EndIf
   WEnd
#cs
Автобой
#ce
  while 1
Sleep(9000)
mouseclick("left", 362, 325, 1)
sleep(7000)
mouseclick("left", 362, 325, 1)
sleep(7000)
mouseclick("left", 362, 400, 1)
sleep(7000)
   $coord = PixelSearch( 180, 215, 820, 470, 0x436500, 6, 2)
   if not @error then
	  WinClose("X и Y равны:", "x ,y")
	  MouseMove( 410 ,100 ,  0 )
	  sleep(50000)
	  MouseClick ( "",410 ,100, 1, 0 )
	  ExitLoop
   EndIf
   WEnd
wend


Я просто думаю может надо как-то через массивы, то есть возле найденной точки записать близлежащие координаты, и если вдруг одна из них желтого цвета то переход к следующей точке, только вот как это сделать я не знаю=(. В общем как-то надо проверить желтый
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
а чем не подходит такой вариант:
Код:
PixelSearch
if not @error then
  Pixelsearch
  if not @error then
    ;найден 1-й и 2-й цвет
  else
    ;найден только 1-й цвет
  endif
else
  ;1-й цвет не найден
endif
 
Автор
V

Vaffl9

Новичок
Сообщения
8
Репутация
1
Спасибо вроде работает) :IL_AutoIt_1:
 

running-frag

why me?
Сообщения
441
Репутация
60
Очень интересно как оно у тебя работает. Ведь Pixelsearch может зациклится на первой точке, он ведь находит только первую точку, дальше неё не идёт. Т.е. если первая точка косяк - начинаем цикл заново, а т.к. у нас это всё в цикле While True (согласно коду выше) то код безтолковый (поправьте меня).

Я в своё время долго мучался с такой же бедой. Ну вот код, правда его тяжко с ходу понять. Но суть в том что поиск идёт попиксельно с лево-на-право, после первого прохода, опускается на один пиксель вниз (так работает PixelSearch () по умолчанию). Поэтому как мы встречаем "не наш" пиксель мы меняем координаты что б "доискать в текущем Y", после уже задаём новую зону ту что ещё не прошли.

Код:
deleted

При таком подходе можно хоть картики искать (немного модифицировав функцию поиска "второго пикселя"). Данный код работает на 5 баллов (у меня). И к слову он был выужен и переделан с данного форума, в общем нужно гуглить хорошо, тут много чего есть.

Так же для тех кто думает что можно сделать "обычным пробегом PixelGetColor() по координатам и сравнивать пикселя" скажу... Функция PixelSearch() работает в разы быстрее.

PS: Код вырван из констекста и немного изменён, поэтому могут быть ошибки, но цель была показать алгоритм.
 
Автор
V

Vaffl9

Новичок
Сообщения
8
Репутация
1
А как сделать так, чтобы когда он нашел нужный цвет, проверил нет ли рядом цвета который мне не нужен и если такой есть то перейти к следующей точке(1ой) и по новой цикл?
 

running-frag

why me?
Сообщения
441
Репутация
60
А в чём трудности? Ты знаешь функцию
Код:
PixelSearch ()

так же знаешь функцию
Код:
PixelGetColor ()

где проблемы? :smile:

PS: Есть сомнения? Тыкни на функцию - почитай описания.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Vaffl9
http://autoit-script.ru/index.php?topic=9132.msg61662#msg61662
Вот же в этом сообщении и дана такая структура.
 
Верх