Koordinatenproblem

  • Hi

    Ich habe neulich erst mit Au3 angefangen zu programmieren und stehe nun erstmals vor einem Problem

    Ich möchte mit der "MouseClickDrag-Funktion" ein symbol auf dem Desktop bewegen dafür benötige ich ja mehrere Korordinaten (Anfangs- und Endkoordinaten). Ich möchte nun mit Pixelsearch ein z.B. grünes aufpopendes Symbol (bei Maus "Überfahrung" erscheint ein kleines grünes Fenster) auf meinem Desktop suchen und dieses dann zu einer Festen Koordinate bewegen. Nun ist mein Problem, dass das zu bewegende Symbol keinen festen Platz besitzt sondern sich in einem kleinem Gebiet befindet. Nun ist das Problem das mir die Koordinate fehlt um den Befehl auzuführen.

    Mein Ansatz besteht darin das ich dieses genannte Gebiet bereits mit der Maus absuche und wenn etwas in dem Falle grünem erscheint diese Farbe erkenne aber das symbol auf dem ich dann mit der Maus bin nicht bewegen kann da mir ja dann die Koordinaten davon fehlen.

    Ansatz:

    func checkgreen()

    $color = pixelsearch( 230 , 30, 630, 580 , 0x66FF00)
    If Not @error Then

    MouseClickDrag ( "left" , $x, $y ,950, 450 ) ;<-besagtes Problem da $x bzw. $y nicht genommen werden.
    sleep (2000)
    Endif
    Endfunc


    Ich hoffe mir kann jemand helfen


    Gruß Qui Xux

    • Offizieller Beitrag

    Hallo,

    pixelsearch liefert als Ergebnis ein Array mit den Koordinaten an der die Farbe gefunden wurde.

    [autoit]

    func checkgreen()
    $coord = pixelsearch( 230 , 30, 630, 580 , 0x66FF00)
    If Not @error Then
    MouseClickDrag ( "left" , $coord[0], $coord[1] ,950, 450 ) ;<-besagtes Problem da $x bzw. $y nicht genommen werden.
    sleep (2000)
    Endif
    Endfunc

    [/autoit]
  • Vielen Dank klappt soweit, nur tritt eni neuer Fehler auf und zwar habe ich die Mausbewegungen zum suchen des Symbols ebenfalls mit arrays gemacht und das überschneidet sich nun mit diesen arrays kann ich bei den PixelSearch arrays auch andere Zahlen einsetzen? ich habe bereits arrays von 1-20 welche ich jeweils mit koordinaten versehen habe um das Feld zu überprüfen gibt es dafür vielleicht eine andere Möglichkeit?

    Würde mich über weitere so hilfreiche Beiträge freuen und hoffe das ich das bald schaffe :P


    mfg Qui Xux

  • also

    [autoit]


    Dim $xcords[4]
    Dim $ycords[4]
    $xcords[1] = 50 ; symbol finden
    $xcords[2] = 100
    $xcords[3] = 150
    $xcords[4] = 200

    [/autoit][autoit][/autoit][autoit]

    $ycords[1] = 100
    $ycords[2] = 100
    $ycords[3] = 100
    $ycords[4] = 100
    func checkgreen()
    $coord = pixelsearch( 230 , 30, 630, 580 , 0x66FF00)
    If Not @error Then MouseClickDrag ( "left" , $coord[0], $coord[1] ,950, 450 ) ;<- symbol soll bewegt werden aber array überschneidung
    sleep (2000)
    Endif
    Endfunc

    [/autoit][autoit][/autoit][autoit]

    for $i = 2 to 5
    MouseMove ( $xcords[$i] , $ycords[$i]) ; <- soll die koordinaten checken gegebenenfalls das symbol verschieben
    call ("checkgreen")
    sleep ( 100)
    Next

    [/autoit]


    Das Hauptproblem liegt jetzt darin, dass sich die Arrays überschneiden und das Symbol nicht so bewegt wird wie es soll.

    Ich hoffe da sind keine alzuschwerwiegenden Fehler drinnen da es ja bis auf die arrays jetzt geht und damit solltet ihr weiter kommen


    Gruß Qui Xux

    Einmal editiert, zuletzt von qui xux (13. Juli 2008 um 15:48)

    • Offizieller Beitrag

    Ich verstehe nicht, welchen Sinn das hier haben soll:

    [autoit]

    for $i = 2 to 5
    MouseMove ( $xcords[$i] , $ycords[$i]) ; <- soll die koordinaten checken gegebenenfalls das symbol verschieben
    call ("checkgreen")
    sleep ( 100)
    Next

    [/autoit]


    Das Prüfen der Koordinaten (Auffinden Symbol) erledigst du doch mit Pixelsearch. Wozu willst du da auf einer Waagerechten in 50 Pixel Abständen rumspringen, um dann doch jedesmal denselben Bereich abzusuchen ?
    Du müßtest dann die Maus Pixel für Pixel bewegen und jedesmal scannen ob das Symbol auftaucht.

    Edit:
    Also ich glaube, du suchst sowas:

    [autoit]

    Global $x_start = 100, $x_end = 300, $y_start = 100, $y_end = 200
    Global $x_ziel = 400, $y_ziel = 500, $color = 0x66FF00
    For $i = $x_start To $x_end
    For $k = $y_start To $y_end
    MouseMove($i, $k, 1)
    If PixelGetColor($i, $k) = $color Then
    MouseClickDrag('left', $i, $k, $x_ziel, $y_ziel, 1)
    ExitLoop(2)
    EndIf
    Next
    Next

    [/autoit]
  • musste auch noch mal lesen warum diese zeilen da stehen

    Spoiler anzeigen
    [autoit]


    Dim $xcords[4]
    Dim $ycords[4]
    $xcords[1] = 50 ; symbol finden
    $xcords[2] = 100
    $xcords[3] = 150
    $xcords[4] = 200

    [/autoit] [autoit][/autoit] [autoit]

    $ycords[1] = 100
    $ycords[2] = 100
    $ycords[3] = 100
    $ycords[4] = 100

    [/autoit] [autoit][/autoit] [autoit]

    for $i = 2 to 5
    MouseMove ( $xcords[$i] , $ycords[$i]) ; <- soll die koordinaten checken gegebenenfalls das symbol verschieben
    call ("checkgreen")
    sleep ( 100)
    Next

    [/autoit]


    Deswegen:

    Ich möchte nun mit Pixelsearch ein z.B. grünes aufpopendes Symbol (bei Maus "Überfahrung" erscheint ein kleines grünes Fenster) auf meinem Desktop suchen und dieses dann zu einer Festen Koordinate bewegen. Nun ist mein Problem, dass das zu bewegende Symbol keinen festen Platz besitzt sondern sich in einem kleinem Gebiet befindet.

    Er muss erstmal mit der maus rüberfahren und dann prüfen, ob das symbol erschienen ist.
    Das Prob liegt in der array bestimmung:

    Spoiler anzeigen
    [autoit]


    Dim $xcords[4]
    Dim $ycords[4]
    $xcords[1] = 50 ; symbol finden
    $xcords[2] = 100
    $xcords[3] = 150
    $xcords[4] = 200

    [/autoit] [autoit][/autoit] [autoit]

    $ycords[1] = 100
    $ycords[2] = 100
    $ycords[3] = 100
    $ycords[4] = 100

    [/autoit]


    mit dim wird festgelegt wieviel dimensionen ein array hat, aber es wird bei 0 begonnen heißt:

    [autoit]


    Dim $xcords[4]
    $xcoords[0] ;niedrigstes
    $ycoords[3] ;höchstes

    [/autoit]


    Den rest kannste dir wohl selbst denken?
    wenn nich sag bescheid
    edit: Und du musst $ycoords nich als array deklarieren immerhin bleibt es immer 100.

    Einmal editiert, zuletzt von twister (14. Juli 2008 um 14:21)

  • vielen dank schonmal klappt soweit script ist fehlerfrei

    nur tritt jetzt ein neues problem auf bei der variante von bugfix und zwar verstehe ich das so, dass pixelsearch nur denjeweiligen pixel kontrolliert, auf dem sich gerade die maus befindet. Nur ist das problem, dass die grüne fläche aufpopt, sobald man mit der maus auf das symbol kommt. Desweiteren ist die Suche nach dem symbol zu fein, da das symbol größer wie ein Pixel ist. ich fertige mal eine skizze an, wie ihr euch das vorzustellen habt. So um das ganze nochmals zu veranschaulichen hier eine grafik. Die suche nach dem Symbol kann also in größeren pixelabständen stattfinden, ich hoffe mit dieser erklärung kann mir jemand weiter helfen, da die variante von bugfix die grüne fläche leider nicht erkennt, da die grüne fläche erst aufpopt, wenn die maus darüber fährt


    Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist. .

    • Offizieller Beitrag

    Na dann eben in 10-er Pixelblöcken die Maus setzen und jeweils den Bereich 10x10 rechts von der Maus scannen:

    [autoit]

    Global $x_start = 100, $x_end = 300, $y_start = 100, $y_end = 200
    Global $x_ziel = 400, $y_ziel = 500, $color = 0x66FF00, $match
    For $i = $x_start To $x_end Step 10
    For $k = $y_start To $y_end Step 10
    MouseMove($i, $k, 5)
    $match = PixelSearch($i, $k, $i+10, $k+10,$color)
    If IsArray($match) Then
    MouseClickDrag('left', $match[0], $match[1], $x_ziel, $y_ziel, 1)
    ExitLoop(2)
    EndIf
    Next
    Next

    [/autoit]
  • vielen danke das hat mcih schon sehr viel weiter gebracht und zwar findet er das symbol und erkennt auch das mit dem auspopen und will auch etwas bewegen nur hab ich jetzt das problem, dass er das symbol rechts nebendran bewegt und nicht das bei dem die grüne fläche aufpopt und nach beenden dieses moves beendet er die funktion ich hätte aber gerne, dass sie weiter läuft und er das gesammte raster absuche, um bei einer weiteren variante des scripts mehrere symbole zu finden und zu bewegen. könnte mir vielleicht noch jemand sagen was cih falsch mache bzw was falsch ist, warum er nicht das richtige symbol bewegt, sondern das andere? ich habe bereits versucht durch änderungen dies zu erreichen, aber es will nicht klappen


    vielen dank schonmal

    Gruß Qui Xux

    • Offizieller Beitrag

    dass er das symbol rechts nebendran bewegt und nicht das bei dem die grüne fläche aufpopt


    Das liegt wohl daran, dass das grüne Feld nicht über dem eigentlichen Icon, sondern rechts daneben erscheint. Dann setze das Raster auf 5 Pixel herunter, dann ist die Chance größer, dass der über dem richtigen Icon liegende Bereich erwischt wird.

    ich hätte aber gerne, dass sie weiter läuft und er das gesammte raster absuchet


    Grundsätzlich kein Problem, entferne ExitLoop aus der Schleife und probiere.

  • heißt das also, dass ich nie 100%ig das symbol bewegt bekomme oder gibt es da eine andere möglichkeit? das mit dem weiter laufen funktioniert bereits aber so gefällt mir das nciht, dass das falsche symbol bewegt wird :( wenn es eine solche möglichkeit gibt könntest du mir diese bitte schildern? wäre sehr nett von dir


    mfg qui xux

  • ich hab vorhin mit der zeichnung etwas ungenau gearbeitet das grün liegt außerhalb des symbols-.- also gibt es keine möglichkeit es so zu machen oder?

    mfg qui xux

  • vielen dank für den tipp ich werds gleich mal ausprobieren und dir dann nochmal bescheid sagen

    mfg qui xux

  • Der Tip war perfekt er bewegt jetzt das richtige symbol nur eine allerletzte frage noch was muss ich ändern, damit er die farbe erkennt, wenn sie etwas weiter nach oben versetzt erscheint. Er erkennt bis jetzt nur das grün, wenn es sich neben dem symbol/der maus befindet, aber nicht wenn es sich schräg über diesem befindet. ( grüner balken unteres ende schließt mit oberer und rechter kante des symbols ab und wird dann nicht erkannt)

    es wäre nett wenn du mir noch ein letztes mal helfen könntest dann läuft mein progrämmchen so wie ich es will


    Mfg Qui Xux