Что нового

[Мышь, клавиатура] PixelSearch от центра раб. стола

vkalun79

Новичок
Сообщения
2
Репутация
0
Кликер под игру Darkorbit.com
Помогите пожалуйста с куском кода. Нужно чтоб скрипт искал Pixel от центра рабочего стола по спирали и кликал если нашел! Весь форум наверно перелистал но так и не нашел примеров((. Только мышкой по спирали пример нашел, пробовал переделать так не получилось!((.
Код:
Global $Paused
   HotKeySet("{я}", "TogglePause")
   HotKeySet("{Esc}", "Terminate")
   Send("{я}")
 ;;;;;;;;;;
   While 1
         analiz()
   WEnd
;;	
   Func analiz() ; анализирует местонахождение
	   
   $pos = PixelSearch( 9, 87, 1272, 981, 0xBC0F17, 4)  ; ищет коробку по всей карте
   Select								
	       Case Not @error
					 MouseClick("left" , $pos[0], $pos[1], 1, 1)  ;КЛИКАЕМ И...  
   $boxy = 1
	       Case @error
   $boxy = 0
   EndSelect
;;;;;;;;		 
   Select	 
	  Case $boxy = 1
	                     MsgBox (0, "", "я нашел коробку")
	  boksy_box()
			EndSelect
   EndFunc
;;;;;;;		  
   Func boksy_box()
   While 1
		 $pos = PixelSearch( 9, 87, 1272, 981, 0xBC0F17, 4)  ;;;; ищет коробку по всей карте! от левого x_y
			   if not @error then                            ;;;;а надо спиралью от центра (@DesktopHeight/2,@DesktopWidth/2)      
			MouseClick("left" , $pos[0], $pos[1], 1, 1)      ;;;;;;нашёл и кликнул!
	  Sleep(1500)
						   Else
				  ExitLoop
			   EndIf
		 WEnd
   EndFunc	  
	 ;;;;;;;;;;;;;;;;;;
Func TogglePause()
    $Paused = Not $Paused
    While $Paused
        Sleep(100)
        ToolTip('миникарта! Сбор. Пауза {я}!Выход {Esc}!', 972, 942)
    WEnd
    ToolTip("")
EndFunc

Func Terminate()
    Exit 0
EndFunc
 

InnI

AutoIT Гуру
Сообщения
4,950
Репутация
1,445
Но это очень долго (раскомментируйте MouseMove() для оценки скорости)
Код:
Func analiz()
  Local $X = @DesktopWidth / 2
  Local $Y = @DesktopHeight / 2
  Local $Count = 1, $Revers = 1

  Do
    For $i = 1 To $Count
      $X = $X + $Revers
      ; MouseMove($X, $Y, 0)
      $pos = PixelSearch($X, $Y, $X, $Y, 0xBC0F17, 4)
      If Not @error Then ExitLoop 2
    Next
    For $i = 1 To $Count
      $Y = $Y + $Revers
      ; MouseMove($X, $Y, 0)
      $pos = PixelSearch($X, $Y, $X, $Y, 0xBC0F17, 4)
      If Not @error Then ExitLoop 2
    Next
    $Count += 1
    $Revers *= -1
    If $Y = 0 Then ExitLoop ; ограничение по высоте экрана
  Until 0

  If IsArray($pos) Then
    MouseClick("left", $pos[0], $pos[1], 1, 1)
    $boxy = 1
  Else
    $boxy = 0
  EndIf
EndFunc



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

Проверяйте. Ищет по спирали по часовой стрелке от центра указанного прямоугольника. Работает быстро, но не учитывает отличия цвета (shade-variation). Возможность работы в неактивном окне
Код:
#include <WinAPIEx.au3>
#include <WindowsConstants.au3>

While 1
  analiz()
WEnd

Func analiz()
  $pos = _PixelSpiralSearch(9, 87, 1263, 894, 0xBC0F17)
  If $pos[0] <> -1 Then
    MouseClick("left", $pos[0], $pos[1], 1, 1)
    $boxy = 1
  Else
    $boxy = 0
  EndIf
EndFunc

Func _PixelSpiralSearch($i_X, $i_Y, $i_Width, $i_Height, $i_Color, $h_Wnd = 0)
  Local $i_Size = $i_Width * $i_Height, $a_Pixels[2] = [-1,-1], $h_DC, $h_MemDC, $h_Bitmap, $t_Bits
  If $i_Width < 1 Or $i_Height < 1 Then Return $a_Pixels
  $h_DC = _WinAPI_GetDC($h_Wnd)
  $h_MemDC = _WinAPI_CreateCompatibleDC($h_DC)
  $h_Bitmap = _WinAPI_CreateCompatibleBitmap($h_DC, $i_Width, $i_Height)
  _WinAPI_SelectObject($h_MemDC, $h_Bitmap)
  _WinAPI_BitBlt($h_MemDC, 0, 0, $i_Width, $i_Height, $h_DC, $i_X, $i_Y, $SRCCOPY)
  _WinAPI_DeleteDC($h_MemDC)
  _WinAPI_ReleaseDC($h_Wnd, $h_DC)
  $t_Bits = DllStructCreate('dword[' & $i_Size & ']')
  _WinAPI_GetBitmapBits($h_Bitmap, 4 * $i_Size, DllStructGetPtr($t_Bits))
  _WinAPI_DeleteObject($h_Bitmap)
  Local $X = Round($i_Width / 2)
  Local $Y = Round($i_Height / 2)
  If BitAND(DllStructGetData($t_Bits, 1, $i_Width * ($Y - 1) + $X), 0x00FFFFFF) = $i_Color Then
    $a_Pixels[0] = $X + $i_X - 1
    $a_Pixels[1] = $Y + $i_Y - 1
    Return $a_Pixels
  EndIf
  Local $Count = 1, $Revers = 1, $Left = 0, $Top = 0, $Right = 0, $Bottom = 0
  Do
    For $i = 1 To $Count
      $X = $X + $Revers
      If $X < 1 Then
        $X = 1
        $Left = 1
      EndIf
      If $X > $i_Width Then
        $X = $i_Width
        $Right = 1
      EndIf
      If BitAND(DllStructGetData($t_Bits, 1, $i_Width * ($Y - 1) + $X), 0x00FFFFFF) = $i_Color Then
        $a_Pixels[0] = $X + $i_X - 1
        $a_Pixels[1] = $Y + $i_Y - 1
        Return $a_Pixels
      EndIf
    Next
    For $i = 1 To $Count
      $Y = $Y + $Revers
      If $Y < 1 Then
        $Y = 1
        $Top = 1
      EndIf
      If $Y > $i_Height Then
        $Y = $i_Height
        $Bottom = 1
      EndIf
      If BitAND(DllStructGetData($t_Bits, 1, $i_Width * ($Y - 1) + $X), 0x00FFFFFF) = $i_Color Then
        $a_Pixels[0] = $X + $i_X - 1
        $a_Pixels[1] = $Y + $i_Y - 1
        Return $a_Pixels
      EndIf
    Next
    $Count += 1
    $Revers *= -1
  Until $Left And $Top And $Right And $Bottom
  Return $a_Pixels
EndFunc   ;==>_PixelSpiralSearch
 
Автор
V

vkalun79

Новичок
Сообщения
2
Репутация
0
[Мышь, клавиатура] Re: [Мышь, клавиатура] PixelSearch от центра раб. стола

Спасибо господину InnI Со вторым вариантом ( Ищет по спирали) разобрался! Но это не совсем то что надо, color плавает (от 0 до 4 shade-variation). а первый выходит при включении((. Вроде бы он проще второго варианта!
Что я не так делаю?
На чём сейчас собираю коробки выкладываю, может кому надо)).
Помогите понять как сделать поиск от центра, а то я слово радианы первый раз в жизни слышу((!
Код:
Global $Paused
 HotKeySet("{я}", "TogglePause")
 HotKeySet("{Esc}", "Terminate")
 Send("{я}")


 	Local  $x1=0, $y1=67
;;;;;;;;;;;;;;;;;
  While 1
        analiz()
	WEnd

Func analiz() ; анализирует местонахождение

		PixelSearch( 19, 74, 19, 74, 0x6A94A9)  ;на месте ли пэт?
	Select
        Case Not @error
           $pet_gou = 0
        Case @error
           $pet_gou = 1
EndSelect


	PixelSearch( 44, 182, 44, 182, 0xF8CF90)  ;работает ли пэт?
	Select
        Case Not @error
           $pet = 0
        Case @error
           $pet = 1
EndSelect

PixelSearch( 985, 767, 985, 767, 0x6A94A9)  ;на месте ли миникарта?
	Select
        Case Not @error
           $mini = 0
        Case @error
           $mini = 1
EndSelect

   ;PixelSearch( 564, 271, 609, 289, 0xFEFEFF, 2) ;найти порт (безопасная зона)
   PixelSearch( 621, 294, 762, 329, 0x53BEEF, 3) ;найти порт на ПВП
    Select
        Case Not @error
            $port = 1
        Case @error
            $port = 0
	EndSelect
	$pos = PixelSearch(  9, 87, 1272, 981, 0xFAFDE9, 4)  ; ищет коробку по всей карте
		Select
			Case Not @error
				$boxy = 1
			Case @error
				$boxy = 0
EndSelect
    PixelSearch( 1023, 830, 1206, 940, 0x5E6DC8, 5) ; ищет линию
	 Select
        Case Not @error
            $liniy = 1
        Case @error
            $liniy = 0
EndSelect

    PixelSearch( 640, 703, 646, 709, 0x83C851) ; ищет пиксель для рема
	 Select
        Case Not @error
            $rem = 1
        Case @error
            $rem = 0
EndSelect

	PixelSearch( 568, 568, 575, 577, 0x504F4C) ; ищет соединение ,,,снова
	 Select                                                ;;;
        Case Not @error                                        ;
            $set = 1                                           ;
        Case @error                                          ;
            $set = 0                                        ;
EndSelect
															;
    	PixelSearch( 565, 536, 575, 546, 0xE33D2D) ; ищет соединение КРЕСТА
	 Select
        Case Not @error
            $set_krest = 1
        Case @error
            $set_krest = 0
EndSelect


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Select
		    Case $pet_gou = 1 And $rem = 0 And $set_krest = 0
	 ; MsgBox (0, "ответ", "неашел наместе пэта")
               pet_gou2()
		    Case $pet = 1 And $rem = 0 And $set_krest = 0
	 ; MsgBox (0, "ответ", "неашел рабочего пэта")
               pet2()
	        Case $mini = 1 And $rem = 0 And $set_krest = 0
	 ; MsgBox (0, "ответ", "неашел миникарту")
               no_mini()
	        Case $port = 1
	  MsgBox (0, "ответ", "нашел порт")
              exit_port()

			         ;;;;;;;;;;;;;;;ПОДАРКИ
			  		     Case $boxy = 1 And $set_krest = 0 And $rem = 0
	                       ;MsgBox (0, "", "нашел коробку")
                           boxy_box()
					;;;;;;;;;;;;;;;;КОНЕЦ ПОДАРКАМ
            Case $liniy = 0  And $set_krest = 0 And $rem = 0
   ;MsgBox (0, "", "не нашел линию")
            liniy1()
		    Case $rem = 1 And $set_krest = 0
	;MsgBox (0, "", "нашел ремонт")
			 rem2()
		    Case $set = 1 And $set_krest = 1
	;MsgBox (0, "", "нашел соединение и крест")
             set1()
      EndSelect
EndFunc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Func pet_gou2()
	while 1
         $pos = PixelSearch( 0, 62, 99, 126, 0x6A94A9) ; НАЙТИ пэтА?
				if not @error then
					MouseClickDrag("left", $pos[0]+40, $pos[1]+5, 59, 79, 2)
							sleep(1000)
			                    ExitLoop
							Else
		MouseClick("left" , 1142, 259, 1, 2) ; вывод пэта
	sleep(200) ;СОН
                         ExitLoop
			    EndIf
			WEnd
		 EndFunc

    Func pet2()
			   MouseClick("left" , 36, 186, 1, 2) ; включить пэта
	      sleep(800) ;СОН
		      MouseClick("left" , 197, 180, 1, 2) ; режим  пэта
	      sleep(700) ;СОН
		          MouseClick("left" , 191, 267, 1, 2) ; выбрать сборщика пэта
	      sleep(600) ;СОН

	EndFunc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Func no_mini()
		       while 1
         $pos = PixelSearch( 738, 596, 1090, 832, 0x6A94A9) ; НАЙТИ миникарту
				if not @error then
					MouseClickDrag("left", $pos[0]+40, $pos[1]+5, 1025, 772, 2)
							sleep(1000)
			                    ExitLoop
							Else
		MouseClick("left" , 1224, 184, 1, 2) ; вывод миникарты
	       sleep(3000) ;СОН
                         ExitLoop
			    EndIf
			WEnd
		 EndFunc

Func exit_port()

					$Coord_X = Random(1002, 1187)       ;/рандомный в
				    $Coord_Y = Random(813, 925)         ;\..........  миникарту
				 If Not @error Then
					MouseMove( $Coord_X, $Coord_Y, 1)                       ;___  наводим мышь и
					MouseClick("left")                                                           ;клик
					Sleep(2000)
			EndIf
		 EndFunc

;;;;;;;;;;;;;;;;;;
Func boxy_box();;;;;;;;;;;;;;ПОДАРКИ
                         While 1
									    $pos = PixelSearch(  9, 87, 1272, 981, 0xFAFDE9, 4)  ; ищет коробку деда по всей карте
														if not @error then                                   ;Если найден, то...
														MouseClick("left" , $pos[0],$pos[1], 1, 1)
							                                     sleep(1500)
	                     Else
				ExitLoop
				EndIf
			WEnd
	 EndFunc
;;;;;;;;;;;;;;;;;;;;;;;;КОНЕЦ ПОДАРКАМ

Func liniy1()

					$Coord_X = Random(1001, 1185)       ;/рандомный в
				    $Coord_Y = Random(814, 925)         ;\..........  миникарту
				 If Not @error Then
					MouseMove($Coord_X, $Coord_Y, 1)                       ;___  наводим мышь и
					MouseClick("left")                                                           ;клик
					Sleep(300)
           EndIf
	   EndFunc

Func rem2()
	$pos = PixelSearch( 587, 688, 690, 768, 0x83C851) ; ищет пиксель для рема
	if not @error then
            sleep(12000) ;СОН
	   MouseClick("left" , 643, 491, 1, 2) ;выбор стоимости рема
	   sleep(8000) ;СОН
         MouseClick("left" , $pos[0], $pos[1], 1, 2) ;ремаемся
	sleep(20000) ;СОН

           EndIf
	  EndFunc

Func set1()

MouseClick("left" , 554, 584, 1, 2) ;нажать на соединение
sleep(15000) ;СОН
	  EndFunc
;;;;;;;;;;;;;;;;;;
Func TogglePause()
    $Paused = Not $Paused
    While $Paused
        Sleep(100)
        ToolTip('миникарта! Сбор. Пауза {я}!Выход {Esc}!', 972, 942)
    WEnd
    ToolTip("")
EndFunc

Func Terminate()
    Exit 0
EndFunc
 

InnI

AutoIT Гуру
Сообщения
4,950
Репутация
1,445
vkalun79 [?]
color плавает (от 0 до 4 shade-variation)
Как вы себе представляете "shade-variation" ? В каких границах меняется цвет? Можно вызвать функцию _PixelSpiralSearch() несколько раз для каждого конкретного цвета.

первый выходит при включении
Это только функция. Если вы хотите посмотреть на её работу, то полный скрипт будет выглядеть примерно так
Код:
HotKeySet("{ESC}", "quit")

Do
  analiz()
Until 0

Func analiz()
  Local $X = @DesktopWidth / 2
  Local $Y = @DesktopHeight / 2
  Local $Count = 1, $Revers = 1

  Do
    For $i = 1 To $Count
      $X = $X + $Revers
      ; MouseMove($X, $Y, 0)
      $pos = PixelSearch($X, $Y, $X, $Y, 0xBC0F17, 4)
      If Not @error Then ExitLoop 2
    Next
    For $i = 1 To $Count
      $Y = $Y + $Revers
      ; MouseMove($X, $Y, 0)
      $pos = PixelSearch($X, $Y, $X, $Y, 0xBC0F17, 4)
      If Not @error Then ExitLoop 2
    Next
    $Count += 1
    $Revers *= -1
    If $Y = 0 Then ExitLoop ; ограничение по высоте экрана
  Until 0

  If IsArray($pos) Then
    MouseClick("left", $pos[0], $pos[1], 1, 1)
    $boxy = 1
  Else
    $boxy = 0
  EndIf
EndFunc

Func quit()
  Exit
EndFunc

как сделать поиск от центра, а то я слово радианы
Так вам нужен поиск в окружности? Типа "радар"?
 
Верх