Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Pomoc w pixel search


Rekomendowane odpowiedzi

Opublikowano

Witam mam problem z wyszukaniem pixela. Chciałbym aby skrypt widząc w danym miejscu kolor czerwony robił daną czynnosć a gdy w tym samym miejscu pojawi się kolor czarny to aby robił co innego. Napisałem cos takiego jak niżej i skrypt bez znaczenia czy widzi kolor czarny czy czerwony robi czynnosci przypisane do czerwonego. Co jest źle napisane ?

 

 

HotKeySet("{Esc}", "end")
 
Func end()
Exit
EndFunc   ;==>end
 
Run ( "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe", "C:\Program Files (x86)\Google\Chrome\Application")
MouseClick ( "left", 465, 43, 1, 10)
MouseClick ( "left", 465, 43, 1, 10)
MouseClick ( "left", 217, 55, 1, 10)
Send ( "{c}" )
Sleep ( 2000)
Send ( "{ENTER}" )
Sleep (5000)
 
While 1
Sleep(100)
$szukanie = PixelSearch(0, 0, 1848, 485, 0xB04A43) ;czerwony
If Not @error Then
MouseClick("left", 1340, 543, 1, 10)
Else
$szukanie = PixelSearch(0, 0, 1848, 485, 0x454545)) ;czarny
If Not @error Then
MouseClick("left", 1304, 542, 1, 10)
EndIf
EndIf
WEnd

 

Opublikowano

Po prostu znajduje ten czerwony pixel i robi to co ma robic.

HotKeySet("{Esc}", "end")

Func end()
	Exit
EndFunc   ;==>end

Run("C:\Program Files (x86)\Google\Chrome\Application\chrome.exe", "C:\Program Files (x86)\Google\Chrome\Application")
MouseClick("left", 465, 43, 1, 10)
MouseClick("left", 465, 43, 1, 10)
MouseClick("left", 217, 55, 1, 10)
Send("{c}")
Sleep(2000)
Send("{ENTER}")
Sleep(5000)

While 1
	Sleep(100)
	$szukanie = PixelSearch(0, 0, 1848, 485, 0xB04A43) ;czerwony
	If Not @ Then
		MouseClick("left", 1340, 543, 1, 10)
		ConsoleWrite("Pixel czerwony zostal znaleziony: x=" & $szukanie[0] & " y=" & $szukanie[1] & @CRLF)
	Else
		$szukanie = PixelSearch(0, 0, 1848, 485, 0x454545)) ;czarny
		If Not @ Then
			MouseClick("left", 1304, 542, 1, 10)
		EndIf
	EndIf
WEnd

 

 

Opublikowano

Masakra, tłumaczenie zastosowania ELSE

If <warunek> Then             ; główny warunek
   <instrukcja wykonywana jeśli spełniony zostanie warunek główny>
                               ...
Elseif <inny warunek> Then    ; dodatkowy warunek
   <instrukcja wykonywana jeśli spełniony zostanie drugi warunek, a pierwszy nie>
                               ...
Else
   <instrukcja wykonywana jeśli nie zostanie spełniony żaden z warunków>
                               ...
Endif

Mózg to nie mydło; nie ubędzie Ci go, gdy go użyjesz.

Opublikowano

Nadal jest to samo wszystkie funkcje zostają wykonane przypisane do czerwonego. Chciałbym jak pojawi się w tym miejscu czarny program robił co innego a nie to samo.

Opublikowano

Napisałem tylko wstawić funkcje 

 

IF szuka czerwonego 

.. tu piszesz co ma robić 

ELSEIF szuka czarnego 

.. tu piszesz co ma robić 

ELSE robi coś albo nic jak nie ma czerwonego albo czarnego 

.. tu piszesz co ma robić 

ENDIF 

Mózg to nie mydło; nie ubędzie Ci go, gdy go użyjesz.

Opublikowano
Tak ma być ?

 

HotKeySet("{Esc}", "end")

 

Func end()

Exit

EndFunc   ;==>end

 

Run("C:\Program Files (x86)\Google\Chrome\Application\chrome.exe", "C:\Program Files (x86)\Google\Chrome\Application")

MouseClick("left", 465, 43, 1, 10)

MouseClick("left", 465, 43, 1, 10)

MouseClick("left", 217, 55, 1, 10)

Send("{c}")

Sleep(2000)

Send("{ENTER}")

Sleep(5000)

 

While 1

Sleep(100)

$szukanie = PixelSearch(0, 0, 1848, 485, 0xB04A43) ;czerwony

If Not @error Then

MouseClick("left", 1340, 543, 1, 10)

ConsoleWrite("Pixel czerwony zostal znaleziony: x=" & $szukanie[0] & " y=" & $szukanie[1] & @CRLF)

ElseIf

$szukanie = PixelSearch(0, 0, 1848, 485, 0x454545)) ;czarny

If Not @error Then

MouseClick("left", 1304, 542, 1, 10)

EndIf

EndIf

WEnd

Opublikowano

Nie, nie tak. Ale nawet jak dobrze tego elseif'a zastosujesz to nic to nie zmieni.

Problem jest w tym, ze przeszukujesz zbyt duzy obszar jak na pojedynczy pixel. Gdzies przed tym twoim czarnym kolorem jest czerwony pixel ktorego moze golym okiem nie widzisz, ale on tam jest i program po prostu wykonuje swoja robote. ;)

 

Rysunek pogladowy.

RYAR8LK.jpg

 

Zgadnij co zrobi w tym wypadku program.... Najpierw znajdzie czerwony i zrobi to co ma zrobic dla czerwonego.

 

 

Opublikowano

Dobrze by było zobaczyć screen jak wygląda u niego to co ma szukać . Nie wiadomo w czym ma szukać ( program, pełny ekran czy okienko )  nawet i jakie rodzaje koordynatów należy stosować ( są trzy opty ) 

Mózg to nie mydło; nie ubędzie Ci go, gdy go użyjesz.

Opublikowano

Po co używasz wyszukiwania zamiast pobierania koloru ? 

 

Pozycja chyba się nie zmienia więc prościej dać PixelGetColor i porównać ze wzorcem. 

Do klikania też nie  są potrzebne wyniki szukania koloru. 

Mózg to nie mydło; nie ubędzie Ci go, gdy go użyjesz.

Opublikowano
Co teraz jest źle ?

 

 

HotKeySet("{Esc}", "end")

 

Func end()

Exit

EndFunc   ;==>end

 

Run("C:\Program Files (x86)\Google\Chrome\Application\chrome.exe", "C:\Program Files (x86)\Google\Chrome\Application")

MouseClick("left", 465, 43, 1, 10)

MouseClick("left", 465, 43, 1, 10)

MouseClick("left", 217, 55, 1, 10)

Send("{c}")

Sleep(2000)

Send("{ENTER}")

Sleep(5000)

 

Func ff2()

$x = PixelGetColor(1848, 485)

  if $x = 0xB04A43 Then

    MouseClick("left", 1340, 543, 1, 10)

EndIf

$x = PixelGetColor(1848, 485 )

  if $x = 0x454545 Then

    MouseClick("left", 1304, 542, 1, 10)

  EndIf

EndFunc
Opublikowano

Wszytko, skrypt jest całkiem niepoprawnie napisany 

Mózg to nie mydło; nie ubędzie Ci go, gdy go użyjesz.

Opublikowano

Masz jeden duży błąd i parę rzeczy niepotrzebnych:

1. Definiujesz funkcję ff2(), a nigdzie jej nie wywołujesz. To jest błąd, bo kod w zdefiniowanej funkcji nigdy nie zostanie wykonany. Samo definiowanie funkcji jest moim zdaniem zbędne.

2. Dwukrotne użycie MouseClick("left", 465, 43, 1, 10) jest zbędne, można napisać MouseClick("left", 465, 43, 2). Czwarty parametr (10) nie jest potrzebny, gdyż tyle wynosi jego wartość domyślna.

3. W wywołaniu funkcji MouseClick("left", 217, 55, 1, 10) drugi i trzeci parametr (1, 10) jest zbędny, gdyż są to ich wartości domyślne.

4. Send("{c}") - nawiasy klamrowe są niepotrzebne: Send("c").

5. Tworzenie zmiennych $x jest zbędne, gdyż nigdzie z nich dalej nie korzystasz.

HotKeySet("{Esc}", "end")

Run("C:\Program Files (x86)\Google\Chrome\Application\chrome.exe", "C:\Program Files (x86)\Google\Chrome\Application")
MouseClick("left", 465, 43, 2)
MouseClick("left", 217, 55)
Send("c")
Sleep(2000)
Send("{ENTER}")
Sleep(5000)

While True
   If PixelGetColor(1848, 485) = 0xB04A43 Then
       MouseClick("left", 1340, 543)
   Else       
      If PixelGetColor(1848, 485) = 0x454545 Then MouseClick("left", 1304, 542)
   EndIf
WEnd

;-------------------------------------------------------
Func end()
   Exit
EndFunc   ;==>endc

Teraz skrypt jest poprawny pod względem formalnym, ale nie mogę gwarantować, że robi to czego oczekujesz.

Poczytaj sobie też: https://pl.wikibooks.org/wiki/AutoIt/Przejmowanie_kontroli

Opublikowano
Dzięki wielkie za pomoc lecz jeszcze jest jeden problem. Chciałbym aby funkcja przypisana do koloru czerwonego została przerwana gdy w tym miejscu pojawi się czarny. Jak to zrobic ?

 

HotKeySet("{Esc}", "end")

 

Run("C:\Program Files (x86)\Google\Chrome\Application\chrome.exe", "C:\Program Files (x86)\Google\Chrome\Application")

MouseClick("left", 465, 43, 2)

MouseClick("left", 217, 55)

Send("c")

Sleep(2000)

Send("{ENTER}")

Sleep(5000)

 

While True

   If PixelGetColor(1848, 485) = 0xB04A43 Then

       MouseClick("left", 1341, 545)

  Send ("{BS}")

  Send ("{BS}")

       Send ("{BS}")

       Send ("{BS}")

  Send ("{BS}")

  Send ("{BS}")

  Sleep (100)

  Send ("20")

  MouseClick ("left", 1075, 667)

  Sleep (40000)

  MouseClick ("left", 1944, 546)

  MouseClick ("left", 1075, 667)

   Else

      If PixelGetColor(1848, 485) = 0x454545 Then MouseClick("left", 2409, 183)

   EndIf

WEnd

 

;-------------------------------------------------------

Func end()

   Exit

EndFunc   ;==>endc
Opublikowano

Mówisz o przerwaniu funkcji przypisanej do koloru czerwonego, a przecież nie ma żadnej takiej funkcji. Jedyną funkcją jest funkcja end() kończąca skrypt.

Nie bardzo rozumiem co chcesz osiągnąć. Czy skrypt ma zakończy działanie w momencie gdy na współrzędnych (1848, 485) pojawi się kolor 0x454545.

Jeżeli tak to zamiast:

If PixelGetColor(1848, 485) = 0x454545 Then MouseClick("left", 2409, 183)

trzeba wstawić:

If PixelGetColor(1848, 485) = 0x454545 Then end()

 

Jeżeli nie o to ci chodzi to musisz precyzyjniej określić swoje potrzeby, bo inaczej nie będę w stanie ci pomóc.

Opublikowano

Chodzi mi o to aby kroki które mają być wykonane przypisane do koloru czerwonego trwały cały czas lecz gdy zmieni się na kolor czarny od razu zaczyna robić to co przypisałem do czarnego.

Powiedzmy tak. Funkcja trwa:

While True
   If PixelGetColor(1848, 485) = 0xB04A43 Then
       MouseClick("left", 1421, 546)
  Send ("{BS}")
  Send ("{BS}")
       Send ("{BS}")
       Send ("{BS}")
  Send ("{BS}")
  Send ("{BS}")
  Sleep (100)
  Send ("20")
 
W tym momencie na ekranie wyskakuje kolor czarny i chciałbym aby nie było kontynuowane to dalej:
 
  MouseClick ("left", 1075, 667)
  Sleep (40000)
 
Tylko żeby program zaczął wykonywać kroki przypisane do czarnego, czyli.
 
If PixelGetColor(1848, 485) = 0x454545 Then MouseClick("left", 1421, 546)
  Send ("{BS}")
  Send ("{BS}")
       Send ("{BS}")
       Send ("{BS}")
  Send ("{BS}")
  Send ("{BS}")
  Sleep (100)
  Send ("20")
  MouseClick("left", 2087, 665)
  Sleep (40000)
 
 
Opublikowano

Chcieć to sobie możesz, w Autoit musi być wszystko wykonane po kolei tak jak napisałeś, skrypt działa jak należny , kończy sleepy i kliki, i dopiero szuka czarnego. To tylko twoja wina że tak napisałeś skrypt. 

 

 

Albo będziesz co jakiś czas sprawdzał czy jest czarny albo spróbuj użyć AdlibRegister 

 

IF-y się ZAMYKA , masz dwa wiec dwa razy trzeba zamknąć, od poprawności skryptu masz Tidy, użyj czasem. 

 

Zresztą i tak trochę bez sensu piszesz, po ELSE znowu IF , tylko po co ?  jak już jest warunek ELSE. Przy okazji wpierdoliło gdzieś warunek ELSEIF, wiec skrypt nie robi tego co powinien normalnie robić, wykonuje sie po kolei. 

Mózg to nie mydło; nie ubędzie Ci go, gdy go użyjesz.

Opublikowano

Może coś takiego:

HotKeySet("{Esc}", "end")

While True
   If PixelGetColor(1848, 485) = 0xB04A43 Then
      MouseClick("left", 1421, 546)
      Send ("{BS 6}")
      Sleep (100)
      Send ("20")
      If IsBlack() Then ContinueLoop
      MouseClick ("left", 1075, 667)
      Sleep (40000)
   EndIf
   Sleep(100)
WEnd

;-------------------------------------------------------
Func IsBlack()
   If PixelGetColor(1848, 485) = 0x454545 Then
      MouseClick("left", 1421, 546)
      Send ("{BS 6}")
      Sleep (100)
      Send ("20")
      MouseClick("left", 2087, 665)
      Sleep (40000)
      Return True
   Else
      Return False
   EndIf
EndFunc

Func end()
   Exit
EndFunc 
Opublikowano

Też mu to niewiele robi bo 40 s pauzuje , można dodać licznik niech sprawdza np co 2 s 

Mózg to nie mydło; nie ubędzie Ci go, gdy go użyjesz.

Opublikowano

Pewnie masz rację, bo przez te 40s nic się nie będzie działo, więc może lepiej będzie ten czas podzielić na porcje, np tak:

HotKeySet("{Esc}", "end")

While True
   If PixelGetColor(1848, 485) = 0xB04A43 Then
      MouseClick("left", 1421, 546)
      Send ("{BS 6}")
      Sleep (100)
      Send ("20")
      MouseClick ("left", 1075, 667)
      For $i=1 To 20
         If IsBlack() Then ContinueLoop 2
	 Sleep(2000)
      Next
   EndIf
   Sleep(100)
WEnd

;-------------------------------------------------------
Func IsBlack()
   If PixelGetColor(1848, 485) = 0x454545 Then
      MouseClick("left", 1421, 546)
      Send ("{BS 6}")
      Sleep (100)
      Send ("20")
      MouseClick("left", 2087, 665)
      Sleep (40000)
      Return True
   Else
      Return False
   EndIf
EndFunc

Func end()
   Exit
EndFunc 

Ale nie nam to oceniać. Tu powinien wypowiedzieć się Michalek9955.

Opublikowano

Teraz to już nie wiem jak to ma działać.

W tej chwili skrypt działa tak:

1. Czeka aż na współrzędnych (1848, 485) pojawi się kolor czerwony (0xB04A43)

2. Gdy pojawi się kolor czerwony to wykona podaną sekwencję klawiszy, jednocześnie sprawdzając co 2 sek. czy na w/w współrzędnych pojawił się kolor czarny (sprawdzanie w funkcji IsBlack()).

3. Jeżeli pojawił się kolor czarny to w funkcji IsBlack() wykona odpowiednią sekwencję klawiszy, odczeka 40 sek. i wróci do pętli głównej, gdzie znowu będzie oczekiwał na kolor czerwony.

 

Jeżeli ma działać inaczej, to musisz to dokładnie opisać, bo zaczynam się gubić w tym co właściwie chcesz osiągnąć.

 

Pozdrawiam

Opublikowano

O to mi chodziło tylko chciałbym aby było tak jeszcze z kolorem zielonym, że też sprawdza co 2 sekundy czy pojawi się zielony jak pojawi się to wykonuje odpowiednią sekwencje klawiszy a następnie odczekuje 40 sekund. Po 40 sekundach rozpoznaje kolor, jeśli czarny to robi sekwencje przypisaną do tego koloru jak czerwony to robi sekwencje przypisaną do czerwonego.

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...