Letztens, beim Artikel über HotKeySet in AutoIt, fragte HansDampf, wie man denn ohne vorgegebene Pixel/Koordinaten in Scripten arbeiten könne. Ich erwähnte in dem Artikel Farberkennung, war mit der Materie aber noch nicht so vertraut.
Mittlerweile habe ich mich mit der Funktion von Farberkennung in AutoIt beschäftigt und bin begeistert.
PixelSearch() sucht euch den ersten Pixel in einem rechteckigen Zielgebiet, auf den die Farbbeschreibung zustimmt.
Code:
Pixelsearch(x-linksoben, y-linksoben, x-rechtsunten, y-rechtsunten, Hexfarbe[, Abweichung, Schritte])
Was für die Funktion also nötig ist sind 2 Koordinatenpaare und die gesuchte Farbe. Die Koordinate der oberen linken Ecke des Suchfelds (x und y) und von der unteren rechten Ecke (x und y). Um von den fixen Koordinaten wegzukommen sollte man den User 1x auffordern, an eine bestimmte Stelle zu klicken und danach alles relativ zum 1. Klick zusammen mit PixelSearch gestalten.
Je größer der Wert der Abweichung, desto ungenauer kann man die Farbe angeben, desto mehr Pixel werden gefunden.
Das letzte Argument gibt an, jeder wievielte Pixel untersucht werden soll. 10 würde bewirken, dass nur jeder 10 Pixel getestet wird. Das pusht natürlich die Geschwindigkeit.
Ein Beispiel:
$waittime = 3000 MsgBox(0,"Ecke oben links","Führe die Maus über die Ecke des Flash-Games oben links, du hast " & ($waittime/1000) & " Sekunden.") Sleep($waittime) $ol = MouseGetPos() ; Nur zur Kontrolle MsgBox(0,"pos",""&$ol[0]&" | " &$ol[1]&" | " &$ol[0]+472& " | " &$ol[1]+315&"") $center = PixelSearch($ol[0],$ol[1],$ol[0]+472,$ol[1]+315, 0xFFFFFF) MouseMove($center[0],$center[1],1) while True If Hex(PixelGetColor($center[0]+170,$center[1]+110),6)="FFFFFF" Then MouseClick("left",$center[0]+170,$center[1]+110,1,1) Sleep(2000) EndIf [...]
Ich frage den Benutzer bewusst nach 1 Koordinate; die der oberen linken Ecke des Flash Games. Diese bekomme ich einfach in dem der Spieler die Maus darüber bewegt und ich die Mauskoordinaten auslese. Da ich weiß wie groß das Flash Game Fenster ist kann ich PixelSearch auch das 2. Koordinatenpaar der Ecke unten rechts übergeben, ohne es vom Nutzer zu fordern.
Ab dem Punkt gehe ich nur noch über relative Pixelangaben vor, keine festen Werte mehr, die angepasst werden müssen.
Der Code geht noch weiter und funktioniert wunderbar in allen Browsern, in allen Monitorauflösungen und Fensterpositionen. Die Lösung kostet auf jeden Fall viel mehr Zeit als wenn der User am Anfang ein paar Koordinaten angibt aber einmal programmiert ist es eben die bessere Lösung.
Stay Tuned, morgen oder Übermorgen zeige ich den ersten Bot basierend auf PixelSearch und PixelGetColor.