Von der Mitte aus suchen

05/19/2015 23:20 Questhilfe#1
Hi Leute

Gibt es eine Möglichkeit, das die ImageSearch Funktion immer von der Mitte aus "berechnet" wird?

Hier ein kleines Beispiel:
[Only registered and activated users can see links. Click Here To Register...]

Das Blaue Kreutz in der Mitte soll die Desktopmitte und zugleich den "Charakter" symbolisieren.
Der Charakter soll die Sterne, die von eins bis vier gekennzeichnet sind, einsammeln.

Zur Zeit wählt die ImageSearch Funktion bei mir willkürlich aus, sprich:
Es ergibt sich kein "intelligentes Muster"
Er könnte sie 1-3-4-2, 4-1-3-2, 1-4-2-3 etc. einsammeln. Dadurch würde er eine längere Laufzeit und somit suboptimale Effektivität garantieren.

Ich würde es gerne so hinkriegen, dass wenn das gesuchte Ziel mehrfach auf dem Bildschirm zu sehen ist, immer von der Mitte aus berechnet wird, welcher (in diesem Falle Stern) am nächsten liegt.

Sprich:
Der Charakter würde zu Stern 3 laufen, den Stern einsammeln und von der eingesammelten Position neu berechnen, welcher Stern näher liegt - in diesem Falle Stern 4.
Somit wäre der Zyklus 3-4-2-1 und das immer wieder.

Ist das mit AutoIt möglich, oder muss man dafür andere Sprachen wie C+ oder der Gleichen benutzen?
05/20/2015 01:30 alpines#2
Das kann man auch in AutoIt machen. Entweder holst du die Positionen der Sterne über ImageSearch oder MemoryReads.

Danach ist das eigentlich nur noch lineare Algebra.
Code:
Distanz = Sqrt((X2 - X1)^2 + (Y2 - Y1)^2)
X,Y 1 sind dabei die X und Y Koordinaten des Charakters.
Du berechnest den Abstand von jedem Punkt zum Spieler und nimmst den kleinsten Abstand, schmeißt den aus der Liste raus und vergleichst wieder die Abstände, schmeißt den kleinsten raus etc
05/20/2015 02:12 Crossside#3
Das ganze ist im Grunde ziemlich einfach.

Ablauf in etwa:

1) ImageSearch komplett durchlaufen lassen, jeden Punkt den du findest in ein Array packen (die Position)
2) Nun den Abstand von deiner Position (Mitte) zu allen gefundenen Punkten berechnen
3) Nun das Ziel was am nächsten zu dir ist ansteuern. Anschließend das ganze repeaten

[Only registered and activated users can see links. Click Here To Register...]

Kleine Skizze..

grüße
05/20/2015 02:20 Moneypulation#4
Quote:
Originally Posted by Crossside View Post
1) ImageSearch komplett durchlaufen lassen, jeden Punkt den du findest in ein Array packen (die Position)
Wie bekommt man denn alle gefundenen Bilder von ImageSearch? Soweit ich weiß sucht ImageSearch das Bild von oben links nach unten rechts und liefert nur 0 bzw. 1 zurück wenn es ein Bild gefunden hat.
05/20/2015 09:14 alpines#5
Quote:
Originally Posted by Crossside View Post
...
Und worin unterscheidet sich das zu meinem Vorschlag?

@Moneypulation, das ist doch ganz einfach. Du suchst die Koordinaten entweder per MemoryRead oder du scannst kleinere Bereiche des Bildschirms ab.
05/20/2015 09:21 Moneypulation#6
Quote:
Originally Posted by alpines View Post
Und worin unterscheidet sich das zu meinem Vorschlag?

@Moneypulation, das ist doch ganz einfach. Du suchst die Koordinaten entweder per MemoryRead oder du scannst kleinere Bereiche des Bildschirms ab.
Mit MemoryRead konnte ichs mir vorstellen aber nicht mit ImageSearch.

[Only registered and activated users can see links. Click Here To Register...]

Wenn man jetzt sein Bildschirm in z.b. 4 rechtecke teilt, dann ist das nur zum teil besser, weil er den 3. stern zuerst einsammeln wird obwohl der 2. viel näher ist, weil ImageSearch für oben links nur die koordinaten von stern 1 zurückgibt. Ich schätze es würde sich erst lohnen wenn man sein bildschirm in 16 rechtecke teilt. Aber 16x imagesearch dauert sicher 3-6 sekunden und ist daher ineffizient
05/20/2015 10:16 alpines#7
Wenn es keine animierten Sachen sind könnte man mit PixelPattern sicherlich noch was an der Geschwindigkeit retten. Dann suchst man nicht mehr nach dem Bild sondern nach einer bestimmten Anordnung von Pixeln.
05/20/2015 16:20 Crossside#8
Quote:
Originally Posted by alpines View Post
Und worin unterscheidet sich das zu meinem Vorschlag?

Hab ich behauptet das es das tut?
Ich hab lediglich dem OP geantwortet wie ich es machen würde.
Und da ich sonst nicht so viel Autoit (=garnicht) mache, hab ich ihm nur erklärt wie man es Theoretisch macht. Die Lösung ist halt nur auf einer Art wirklich gut lösbar (also wenn man pixelbots bauen will).. von daher ist deine Methode halt gleich / ähnlich.. was ist daran schlimm?

@OP
Gibts in Autoit keine Methode um einzelne Pixel anhand von Farben zu durchsuchen? Dann könntets du es damit lösen (maybe).
Wobei es sicher aber auch einfacher gehen würde wenn du mit Memory Reading hantieren würdest. Sofern das ganze wie es aussieht eine Art Seafight Bot werden soll musst du dir was einfallen lassen.
05/22/2015 05:40 YatoDev#9
ImageSearch & Pixelsearch haben nen param wo die mit suchen anfangen sollen.....
05/24/2015 19:04 Questhilfe#10
Es handelt sich um ein BrowserGame, wodurch die Verwendung von MemoryRead meines Erachtens nach nicht greifen kann. Jedenfalls überschreitet dies meine Fähigkeiten.

Hab bis Dato immer noch keine richtige Lösung finden können.

@VP:
Meinst du den Parameter bei ImageSearchArea, wodurch nicht der ganze Desktop abgesucht wird?