X/Y Koordinaten in Send Befehle

  • Hallo zusammen,

    WOW mein 1. Post :P

    Also ich möchte gerne Koordinaten (X/Y) die von einem Gamepad kommen (funktioniert schon) als SEND Befehle in die richtige Richtung(unten,oben,rechts,links) ausführen.

    Nur wie? Mit umwandeln oder so??

    also z.B.

    [autoit]

    $X = 35974
    $Y = 23478
    ; => Hier irgendwie umwandlen (oder auch nicht wenn man die werte direkt verarbeiten kann)
    [Punkte(...) durch die Werte ersetzten]
    If $X_Umgewandelt < ... And $X_Umgewandelt > ... And $Y_Umgewandelt < ... And $Y_Umgewandelt > ... Then
    Send("{LEFT DOWN}")
    EndIf

    [/autoit]

    Ich hoffe mal ihr versteht wie ich es machen will ;)

    Danke schon mal für eure anworten

    Mfg Keyle

    • Offizieller Beitrag

    Willst du einen Mausersatz programmieren ?

  • Hi und Willkommen im Forum :)

    Wie setzen sich die Koordinaten denn zusammen?

    Wie ist die Koordinate bei Mittelstellung.
    Dann müsstest du halt noch ein paar Koordinaten "sammeln" und hier mit der Richtung Posten, weil ich mir unter der Frage im Moment nicht so viel vorstellen kann ;)

    • Offizieller Beitrag

    Wie anno2008 schon richtig sagte sind mehr Koordinaten und vor allem deren Entsprechung auf dem Desktop notwendig.
    Es kann sein, dass deine Parameter linear oder auch nichtlinear sind. Du brauchst also auf jeden Fall Basiswerte für alle Desktopecken und die Mittelposition. Dann kann man erkennen, wie die Werte sich verhalten.

  • Also ich benutzte als Gamepad meine PSP.

    Das Gamepad bzw. die PSP hat:
    -2 Achsen
    -9 Buttons
    -1 POV

    Mittelposition ist: X=35996 , Y=35996
    Beide Werte sind 0 wenn ich den den Knüppel nach Oben-links schiebe
    Mit diesem Script komme ich an die Daten fals das hilft:

    Spoiler anzeigen
    [autoit]

    Func _GetJoy($lpJoy, $iJoy)
    Local $coor, $ret

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

    Dim $coor[8]
    DllCall("Winmm.dll", "int", "joyGetPosEx", _
    "int", $iJoy, _
    "ptr", DllStructGetPtr($lpJoy))

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

    If Not @error Then
    $coor[0] = DllStructGetData($lpJoy, 1, 3)
    $coor[1] = DllStructGetData($lpJoy, 1, 4)
    $coor[2] = DllStructGetData($lpJoy, 1, 5)
    $coor[3] = DllStructGetData($lpJoy, 1, 6)
    $coor[4] = DllStructGetData($lpJoy, 1, 7)
    $coor[5] = DllStructGetData($lpJoy, 1, 8)
    $coor[6] = DllStructGetData($lpJoy, 1, 11)
    $coor[7] = DllStructGetData($lpJoy, 1, 9)
    EndIf

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

    Return $coor
    EndFunc ;==>_GetJoy

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

    Func _JoyInit()
    Local $joy
    Global $JOYINFOEX_struct = "dword[13]"

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

    $joy = DllStructCreate($JOYINFOEX_struct)
    If @error Then Return 0
    DllStructSetData($joy, 1, DllStructGetSize($joy), 1);dwSize = sizeof(struct)
    DllStructSetData($joy, 1, 255, 2) ;dwFlags = GetAll
    Return $joy
    EndFunc ;==>_JoyInit

    [/autoit]

    Was meinst du mit linear und nichtlinear ich kann mir darunter jetzt nichts vorstellen

    • Offizieller Beitrag

    Was meinst du mit linear und nichtlinear ich kann mir darunter jetzt nichts vorstellen


    Linear heißt: 1 Pixel des Desktop entspricht zum Bsp. dem Wert 25 der von deinem Pad kommt, 2=50, 3=75, 4=100 etc.
    Nicht-Linear: 1=25, 2=70, 3=130 etc.

    • Offizieller Beitrag

    Sammel mal die X und Y Werte für links,rechts,unten,oben . Und auch oben rechts,oben links,unten rechts und unten links.

  • Eigentlich ist es doch völlig egal, ob das Pad linear oder nicht-linear arbeitet, weil die Maus ja gar nicht umgesetzt werden soll.
    Du willst ja nur, dass dein Script anhand der Position des Sticks erkennen kann, ob der Stick nach oben, nach rechts oder nach links gedrückt ist.

    Eigentlich hast du ja schon richtig angefangen, nur dass die ganze Umwandlung völlig unnötig ist. Du musst ja "nur" eine Range erstellen, in der Dein Stick nach oben gedrückt ist, nach unten gedrückt ist, oder nach recht, oder links gedrückt ist. Ich würde dir ja gerne Helfen, aber ich denke man braucht wirklich ein paar mehr Postionen. Also ich denke da an Oben links, Oben Mitte, Oben rechts, Mitte Links, Mitte Mitte, Mitte Rechts, Unten Links, Unten Mitte und Unten Rechts.

    Dann ist noch die Frage, ab wo z.B. oben ist. Wenn dein Stick Diagonal nach oben links gestellt ist, ist das dann nach Oben oder nach Links?

  • Hier mal nen Pic, Photoshop lässt grüßen:

    [Blockierte Grafik: http://www.abload.de/thumb/pspc1gn.jpg]

    Also alle Angaben sind ungefähr und von mir manuell getestet:

    Oben Links ≈ X0,Y0
    Oben ≈ X40000,Y0
    Oben Rechts ≈X65500,Y0
    Rechts ≈X6550,Y36000
    Unten Rechts ≈X65500,Y58000 Unten ≈X41000,Y65000
    Unten Links ≈X5000,Y65000
    Links ≈X0,Y35000

    Edit: ich hab überall versucht genau die Mitte zu treffen also genau zwischen 2 Strichen
    Edit2: da muss man aber schon große Wertebereiche nehmen damit dass funz sonst trifft man die Stellen gar nicht

    Edit3: Wäre es einfacher mit Zahlen von 0 - 255 zu rechnen oder es in grad zu wandeln???

  • Ich habs selbst geschafft :D

    Hier mal die Lösung wenns einen interessiert:

    Spoiler anzeigen
    [autoit]


    $joy = _JoyInit()
    While 1
    $coord = _GetJoy($joy, 0)
    $coordX = Round($coord[0] / 255, 0)
    $coordY = Round($coord[1] / 255, 0)

    ;~ MsgBox(0,"",$coordX&","&$coordY)
    If $coordX > 110 And $coordX < 150 And $coordY > 110 And $coordY < 150 Then
    ;~ MsgBox(0,"","nix")
    Send("{LEFT UP}")
    Send("{UP UP}")
    Send("{RIGHT UP}")
    Send("{DOWN UP}")
    EndIf
    If $coordX < 90 And $coordY > 110 And $coordY < 180 Then
    ;~ MsgBox(0,"","Links")
    Send("{LEFT DOWN}")
    Send("{UP UP}")
    Send("{RIGHT UP}")
    Send("{DOWN UP}")
    EndIf
    If $coordX = 0 Or $coordX < 40 And $coordY > 220 Then
    ;~ MsgBox(0,"","Links-Unten")
    Send("{LEFT DOWN}")
    Send("{UP UP}")
    Send("{RIGHT UP}")
    Send("{DOWN DOWN}")
    EndIf
    If $coordX > 80 And $coordX < 170 And $coordY > 250 Then
    ;~ MsgBox(0,"","Unten")
    Send("{LEFT UP}")
    Send("{UP UP}")
    Send("{RIGHT UP}")
    Send("{DOWN DOWN}")
    EndIf
    If $coordX > 160 And $coordY > 200 Then
    ;~ MsgBox(0,"","Unten-Rechts")
    Send("{LEFT UP}")
    Send("{UP UP}")
    Send("{RIGHT DOWN}")
    Send("{DOWN DOWN}")
    EndIf
    If $coordX > 240 And $coordY > 110 And $coordY < 200 Then
    ;~ MsgBox(0,"","Rechts")
    Send("{LEFT UP}")
    Send("{UP UP}")
    Send("{RIGHT DOWN}")
    Send("{DOWN UP}")
    EndIf
    If $coordX > 180 And $coordY < 90 Then
    ;~ MsgBox(0,"","Oben-Rechts")
    Send("{LEFT UP}")
    Send("{UP DOWN}")
    Send("{RIGHT DOWN}")
    Send("{DOWN UP}")
    EndIf
    If $coordX > 80 And $coordX < 150 And $coordY < 60 Then
    ;~ MsgBox(0,"","Oben")
    Send("{LEFT UP}")
    Send("{UP DOWN}")
    Send("{RIGHT UP}")
    Send("{DOWN UP}")
    EndIf
    If $coordX < 60 And $coordX < 120 And $coordY < 110 Then
    ;~ MsgBox(0,"","Oben-Links")
    Send("{LEFT DOWN}")
    Send("{UP DOWN}")
    Send("{RIGHT UP}")
    Send("{DOWN UP}")
    EndIf
    WEnd

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

    Func _GetJoy($lpJoy, $iJoy)
    Local $coor, $ret

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

    Dim $coor[8]
    DllCall("Winmm.dll", "int", "joyGetPosEx", _
    "int", $iJoy, _
    "ptr", DllStructGetPtr($lpJoy))

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

    If Not @error Then
    $coor[0] = DllStructGetData($lpJoy, 1, 3)
    $coor[1] = DllStructGetData($lpJoy, 1, 4)
    $coor[2] = DllStructGetData($lpJoy, 1, 5)
    $coor[3] = DllStructGetData($lpJoy, 1, 6)
    $coor[4] = DllStructGetData($lpJoy, 1, 7)
    $coor[5] = DllStructGetData($lpJoy, 1, 8)
    $coor[6] = DllStructGetData($lpJoy, 1, 11)
    $coor[7] = DllStructGetData($lpJoy, 1, 9)
    EndIf

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

    Return $coor
    EndFunc ;==>_GetJoy

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

    Func _JoyInit()
    Local $joy
    Global $JOYINFOEX_struct = "dword[13]"

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

    $joy = DllStructCreate($JOYINFOEX_struct)
    If @error Then Return 0
    DllStructSetData($joy, 1, DllStructGetSize($joy), 1);dwSize = sizeof(struct)
    DllStructSetData($joy, 1, 255, 2) ;dwFlags = GetAll
    Return $joy
    EndFunc ;==>_JoyInit

    [/autoit]


    Bin für verbesserungen noch offen :D

  • Es ist unnötig die Werte so groß zu lassen...

    Spoiler anzeigen
    [autoit]


    $joy = _JoyInit()

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

    While 1
    $coord = _GetJoy($joy, 0)
    $coordX = Round($coord[0] / 10000, 0)
    $coordY = Round($coord[1] / 10000, 0)

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

    MsgBox(0,"",$coordX & " " & $coordY, 1)

    if ($coordX = 0) And ($coordY = 0) Then
    MsgBox(0,"","Oben-Links",1)
    Send("{LEFT DOWN}")
    Send("{UP DOWN}")
    Send("{RIGHT UP}")
    Send("{DOWN UP}")
    EndIf

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

    ;usw ...

    [/autoit]

    Das würde reichen, aber eine "wirkliche" Verbesserung ist es nicht. Man hat halt nur kleinere Zahlen, mit denen man besser hantieren kann, aber ansonsten :thumbup: .

    Bei mir würde dann rauskommen:

    Oben rechts: 0|0
    Oben mitte: 3|0
    Oben links: 7|0
    Mite links: 0|3
    Mitte: 3|3
    Mitte rechts: 7|3
    Unten links: 0|7
    Unten mitte: 3|7
    Unten rechts: 7|7