Project by FirePanther
1c6bdde2e1dc69a5ffb9533dea92be7f

Nicht angemeldet.

Das Tutorial wurde noch nicht zuvor von Ihnen gelesen.

Tutorials

Hier finden Sie Tutorials von und für Euch

Tutorialinformationen
632 Zugriffe / 0 Kommentare

Fortgeschrittene Arbeit mit PixelSearch

Kurzbeschreibung
Nutzung von relativen Koordinaten und anderen fortgeschrittenen PixelSearch-Techniken.
Hey, ich will mich auch mal an meinem ersten Tutorial versuchen und das niederschreiben, was ich in langem Ausprobieren und Programmieren(bei meinem 1. Bot) gebraucht und gelernt habe.
Dass ihr wisst, wozu ihr PixelSearch braucht und die ?Grundlagen? aus anderen Tutorials, setze ich voraus.
Für praktische Beispiele wähle ich Seafight.

1. Zur Wiederholung die normale PixelSearch-Funktion:


AutoIt-Quelltext

$variable = PixelSearch(0, 0, @DesktopHeight, @DesktopWidth, 0xFFFFFF, 5)

Wobei $variable bei ERFOLG zu einem Array mit den Koordinaten wird. Die erste Zahl ist der x-Wert und die zweite Zahl der y-Wert des ersten Punktes ist. Danach folgen die Koordinaten des zweiten Punktes.
Zwischen diesen beiden Punkten bildet sich ein ?Such-Rahmen?. Mit (0, 0, @DesktopHeight, @DesktopWidth,?) wird der gesamte Bildschirm abgesucht.
Und zwar nach dem folgenden Wert, der eine Farbe darstellt. Der letzte Wert ist der Toleranzwert? Durch Schattierungen oder Transparenzen z.B. kann es sinnvoll sein, mit einem höheren Toleranzwert zu arbeiten.



2. Scriptausführung bis PixelSearch-Abfrage Ergebnis ausgibt


Habe ich z.B. mein Schiff auf eine Reise geschickt, möchte ich feststellen, ob sich ein Gegner, den ich angreifen möchte, auf den Bildschirm befindet. Dafür muss ich eine stetige Abfrage senden, die mir die gewünschten Informationen liefert.
Dazu muss ich erst mal eine Gemeinsamkeit für alle Gegner heraus finden!
Bei Seafight gibt es in meinen Augen 2 Lösungsansätze:
1. Ich lasse meinen Bot immer wieder die Taste für ?nächstes Ziel anvisieren? betätigen und überprüfe, ob eine Auswahl ?entstanden? ist.
2. Ich wähle die Farbe der Namen(wenn einmalig genug) als ?Suchkriterium?.

Das der zweite Punkt auf den ersten Blick schwammig erscheint, da z.B. weiß nicht so einmalig ist(Eisberge, etc?), entscheiden wir uns also für 1. -> Solange versuchen, ein Ziel anzuvisieren, bis eines anvisiert ist.

AutoIt-Quelltext



So lasse ich den Bot alle drei Sekunden die Taste für ein neues Ziel anklicken, bis er die Farbe ?FF0000? findet(rot, war bis vor Kurzem noch bei Seafight Standard für jeden Feind). Denn nur, wenn er die Farbe findet, wird die Variable $new_target zu einem Array. Erst dann läuft das Script weiter.

Nun können wir weiter damit arbeiten. Aber man sollte nie vergessen, wenn man mit Ergebnissen von PixelSearch-Abfragen arbeitet, dass man ?Folgebefehle? nur ausgeben darf, wenn die Variable ein Array ergibt! Das muss z.B. nach diesem Scriptteil auch wieder abgefragt werden. Sonst beschwert sich AutoIT. Das ist natürlich mit Select?Case?EndSelect oder IF?ENDIF zu lösen!





3.Verfeinerung des Suchbereiches durch Ausgangspunkte


Anhand des ersten Bildes sehen wir ja, dass rund um das eigentliche ?Spielfeld? noch ein Bereich ist, der eventuell unsere PixelSearch-Abfragen stört, bzw. auch langsamer macht! Des Weiteren kann der Nutzer auch das Bild verkleinert ?nutzen? und so unnötig störende Desktopelemente frei legen.
Wir nehmen uns also einen Teil des Bildschirms, der ein möglichst einmaliges Detail aufweist(noch besser, hier ImageSearch zu nutzen!) und bestenfalls noch weit links oben liegt! In Bild 2 wäre das Auge des Totenkopfes z.B. so ein Punkt. Es liegt weit oben und beinhaltet Farben, die sonst nicht weiter vorkommen.

AutoIt-Quelltext

$window = PixelSearch(0, 0, @DesktopHeight, @DesktopWidth, 0x******, 5 ; Ermittelt Ausgangspunkt für Berechnungen eines "positiven Bereichs"


Das Ganze verknüpft man am besten noch mit einer Abfrage, die bei ?Array-sein? die Funktion weiter laufen lässt und sonst eine Fehlermeldung ausgibt, bzw. auch weiter nach diesem Punkt sucht.

Dann macht man am Besten einen Screenshot, damit wir in Ruhe mit AutoIT Bereiche errechnen können.

Wir suchen uns als erstes zwei Punkte raus, die einen geeigneten Bereich ?umschließen? würden (wie im Bild markiert).

Unser Ausganspunkt hat hier, sagen wir als Beispiel 700/100. Je nachdem, wo der Browser sich gerade befindet(durch Pixelsearch bestimmen wir einen ?relativen? Punkt).
Der erste Punkt hat 400/200 und der zweite 1100/800(beispielhaft, keine genauen Werte!).
Nun schauen wir uns an, wie sich X- und Y-Werte verhalten. Liegt es oberhalb des Punktes, wird die Differenz vom Y-Wert subtrahiert, liegt es darunter, wird sie addiert. Liegt es links vom Punkt, wird die Differenz vom X-Wert subtrahiert, liegt es rechts davon, wird sie addiert.
So kommen wir an folgende Werte: 1. Punkt -> -300 +100; 2. Punkt -> +400 +700

AutoIt-Quelltext

$pos = PixelSearch($window[0] - 300, $window[1] + 100, $window[0] + 400, $window[1] + 700, 0xFF0000, 5) ; Sucht, ob ein Feind markiert ist(im pos. Bereich)


So haben wir die Suche auf einen effektiveren Bereich eingeschränkt. Das Ganze lässt sich nun auch sehr leicht auf andere Dinge übertragen! Wie z.B. eine Überprüfung, welchen Typs ein Feind ist.
Dazu mehr im nächsten Teil.




4. Multi-Überprüfungen und relative Bereiche ohne festen Ausganspunkt


Es ist nun ohne weiteres möglich, einen Haufen ?Bedingungen? festzulegen und in einem kleinen Bereich unter dem gefundenen Punkt zu suchen.
Als Beispiel nehmen wir den ?Ziel anvisiert?-Rahmen von Seafight. Ist dieser da, berechnen wir von da aus, ein Feld, dass den Namen des Ziels umfasst. Diesen überprüfen wir dann auf mehrere Farben.

AutoIt-Quelltext



Durch die boolischen Operatoren AND/OR können wir einige Argumente gleichzeitig prüfen und so genau auf jede ?Option? reagieren.

Wie lege den Bereich denn aber fest, wenn ich nicht weiß, welchen Punkt der ?Ziel-Auswahl? PixelSearch nun findet, da eventuell anderes im Wege ist?
Ganz einfach -> Ich vergrößer den Bereich so, dass ich von jedem Punkt aus, einen Teil der Schrift ?erwische?!

Ich rechne also mal, wie breit und hoch die ?Auswahl?-Kreise ca. sind und schaue auch bei unterschiedlich großen Gegnern.
Dann bemerke ich natürlich auch, dass in der Mitte des Monsters immer etwas steht, von da an also die Namen ?geschrieben werden?(nach außen hin, von der Mitte aus).
Und nicht z.B. links am ?Monsterrand? mit den Namen begonnen wird.
Im Bild 4 habe ich versucht, zu verdeutlichen, wie man sich das vorstellen muss. Der gelbe Bereich zeigt mir die Vertikale und der grüne Bereich die Horizontale.
Außerdem habe ich noch zwei Beispielpunkte markiert. Ich sehe also, ich muss einfach von der X-Koordinate immer ?etwas? abziehen und auf die Y-Koordinate addieren. So kann ich, obwohl ich nicht weiß, welcher Punkt gefunden wird, einen Bereich festlegen, der durchsucht wird. Dieser ist zwar etwas größer, als er mit einem konstanten Punkt wäre, spart aber immer noch einige Ressourcen und ist auch wichtig, da ein kleinerer Bereich auch die Wahrscheinlichkeit von störenden ?ähnlich?-Farben senkt.


Ich hoffe, dem ein oder anderen konnte ich damit helfen oder Denkanstöße geben. Das war mein erstes Tutorial, ich hoffe, es gefällt euch.

LG Acanis


Update vom 7.Oktober '09: Habe mir nun mal die Mühe gemacht, ein Programm zu schreiben, dass einem das "Rechnen" ab nimmt :)... -> Pixel-Analyser-Tool
Kommentare Es sind zur Zeit noch keine Kommentare vorhanden...