If-Abfrage

  • Hallo liebe Community. Ich stoße mal wieder an meine Grenzen bei dem Versuch folgende Bedingung in ein Script einzubauen:

    Wenn weder Taste A, noch Taste B, noch Taste C in den letzen 2 Sekunden gedrückt wurde, dann drücke Taste D.
    Das Ganze Soll aber parallel zum normalen Script laufen mit dem Inhalt: wenn a grdrückt wurde drücke Y, wenn b gedrückt wurde drücke Z
    Könntet ihr mir da vllt weiterhelfen?
    Wäre wirklich sehr dankbar.

    [autoit]

    #include <Misc.au3> ; Binde die Misc.au3 ein( für _IsPressed)

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

    While (1) ; beginn der Schleife

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

    If _IsPressed("41") Then ;wenn A gedrückt, dann
    Sleep (Random (20, 30, 1))
    Send("{y}")
    Sleep (Random (20, 30, 1))
    Endif

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

    If _IsPressed("42") Then ; wenn F gedrückt
    Sleep (Random (20, 30, 1))
    Send("{6}")
    Sleep (Random (20, 30, 1))
    EndIf

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

    ;Wenn in den vergangenen 2 Sekunden weder A, B, Noch C gedrückt wurde... Dann ...

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

    WEnd ; Wiederholfe die Schleife

    [/autoit]
  • Würde das mit einem 2D-Array und timerinit / timerdiff lösen.

    Das Array wäre so aufgebaut:

    Code
    zu prüfende Taste | Timestamp | zu drückende Taste


    Initial vergibst du für noch nie gedrückte Tasten einen Timestamp von "" oder -1 und prüfst das später auch. Diesen Defaultwert verwendest du auch nach einer ausgeführten Aktion um die Aktion nicht mehrmals auszuführen (also ein Reset).

    In deiner Hauptschleife prüfst du für alle relevanten Tasten ob sie gedrückt wurden. Falls ja aktualisierst du den zugehörigen Timestamp in deinem Array mit timerinit.
    Nach der Aktualisierung der Timestamps prüfst du ob Aktionen notwendig sind indem du dein Array durchgehst.

    Für die Bedingung "Wenn weder Taste A, noch Taste B, noch Taste C in den letzen 2 Sekunden gedrückt wurde, dann drücke Taste D" brauchst du nun nur mit timerdiff alle drei Timestamps (A,B,C) mit den 2 Sekunden abgleichen. Bleiben alle drei Einträge bei über 2 Sekunden bzw. haben die Einträge noch den Defaultwert, dann führst du die Aktion aus (Taste D). Wenn du nicht willst dass die Aktion danach permanent ohne pausen ausgeführt wird solltest du die Timestamps der drei Tasten setzen, dadurch dauert es dann mindestens 2 Sekunden bis die Taste D Aktion erneut ausgeführt werden kann. Achtung den Timestamp von Taste A solltest du nicht setzen, da du später noch prüfst ob die Taste manuell gedrückt wurde. Eventuell wäre es auch besser eine extra Timer Variable zu verwenden um diese Aktion nur in bestimmten intervallen auszuführen und die Timestamps der einzelnen Tasten nicht zu verändern, dadurch verhinderst du Komplikationen mit deinen anderen Bedingungen.

    Für die beiden anderen Aktionen prüfst du lediglich ob der zugehörige Array Eintrag den Defaultwert oder einen Timestamp hat und führst dementsprechend die Aktion aus. Hierbei nicht vergessen den Timestamp auf den Defaultwert zu setzen, damit die Aktion erst wieder ausgeführt wird wenn die Taste erneut gedrückt wurde.

    Einmal editiert, zuletzt von misterspeed (4. Januar 2015 um 14:12)

  • Du schreibst: "If _IsPressed("42") Then ; wenn F gedrückt", aber die "42" ist das "B". ;)

    So etwas in der Form?

    Spoiler anzeigen
    [autoit]


    #include <Timers.au3>
    #include <Misc.au3>

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

    Local $starttime = _Timer_Init()

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

    While (1)
    ; ist die Zeitdiff größer 2 Sekunden und wurde weder A noch F gedrückt dann ...
    If _Timer_Diff($starttime) > "2000" AND Not _IsPressed("41") AND Not _IsPressed("46") Then
    $starttime = _Timer_Init() ; Timer zurück stellen
    MsgBox(0,"Hinweis","Es wurde zwei Sekunden weder A noch F gedrückt.",1)
    Endif

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

    ; wurde A gedrückt dann ...
    If _IsPressed("41") Then ;wenn A gedrückt, dann
    $starttime = _Timer_Init() ; Timer zurück stellen
    MsgBox(0,"Hinweis auf gedrücktest A", "A wurde gedrückt.",1)
    Endif

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

    ; wurde F gedrückt dann ...
    If _IsPressed("46") Then ; wenn F gedrückt

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

    $starttime = _Timer_Init() ; Timer zurück stellen
    MsgBox(0,"Hinweis auf gedrücktest F", "F wurde gedrückt.",1)
    EndIf

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

    WEnd

    [/autoit]

    Bitte beachte auch den Beitrag von "misterspeed".

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

    5 Mal editiert, zuletzt von Alina (4. Januar 2015 um 14:21)