_isPressed() in einer Switch-Anweisung?

  • Hey,

    ich mache gerade ein kleines Spiel mit GDI+ und man soll Zahlen eingeben können (ohne input field) und ich habe folgenden Code geschrieben:

    [autoit]

    If _IsPressed('30', $dll) Or _IsPressed('60', $dll) Then ; 0 / Num0
    ;
    ElseIf _IsPressed('31', $dll) Or _IsPressed('61', $dll) Then ; 1 / Num1
    ;
    ElseIf _IsPressed('32', $dll) Or _IsPressed('62', $dll) Then ; 2 / Num2
    ;
    ElseIf _IsPressed('33', $dll) Or _IsPressed('63', $dll) Then ; 3 / Num3
    ;
    ElseIf _IsPressed('34', $dll) Or _IsPressed('64', $dll) Then ; 4 / Num4
    ;
    ElseIf _IsPressed('35', $dll) Or _IsPressed('65', $dll) Then ; 5 / Num5
    ;
    ElseIf _IsPressed('36', $dll) Or _IsPressed('66', $dll) Then ; 6 / Num6
    ;
    ElseIf _IsPressed('37', $dll) Or _IsPressed('67', $dll) Then ; 7 / Num7
    ;
    ElseIf _IsPressed('38', $dll) Or _IsPressed('68', $dll) Then ; 8 / Num8
    ;
    ElseIf _IsPressed('39', $dll) Or _IsPressed('69', $dll) Then ; 9 / Num9
    ;
    EndIf

    [/autoit]


    Jetzt ist das natürlich eine Lösung, aber irgendwie fühle ich mich mit diesem if then else-Gerüst unwohl.
    Das ganze wird alle 10ms ausgeführt und ich würde gerne eine Switch-Anweisung benutzen, weiß aber nicht wie, da ich irgendwie nichts zum "switchen" habe.

    Kann mir jemand vielleicht ein bisschen auf die Sprünge helfen?

    Danke im Voraus

  • Danke für die Antwort, aber der Code geht ja mal überhaupt nicht :huh:
    Man braucht immer eine expression in der switch-Anweisung, genau die suche ich ja.

    siehe Hilfe:

    Spoiler anzeigen
    [autoit]

    Switch <expression>
    Case <value> [To <value>] [,<value> [To <value>] ...]
    statement1
    ...
    [Case <value> [To <value>] [,<value> [To <value>] ...]
    statement2
    ...]
    [Case Else
    statementN
    ...]
    EndSwitch

    [/autoit]
  • Stimmt, mit select kann man es ja auch machen. Ich werde das mal ausprobieren und benutzen, wenn es funktioniert.
    Es ist zwar soweit ich weiß langsamer als switch, aber da es bei weitem effektiver ist als if then else, ist das schon in Ordnung :)

    Danke!

  • Falls du wirklich Switch und nicht Select benutzen willst, dann benutze "1" als expression...

    [autoit]

    Switch 1
    Case _IsPressed ("01")
    MsgBox (64, "", "Linke Maustaste")
    Case _IsPressed ("02")
    MsgBox (64, "", "Rechte Maustaste")
    Case ; Das mal nur als Beispiel...
    EndSwitch

    [/autoit]
  • Diese Möglichkeit ist zwar nicht umbedingt besser als die mit der Schleife, sollte aber nicht unerwähnt bleiben. Das ist in diesem Fall natürlich sinnlos, aber in einem Spiel könnte es einfacher sein die Numpad-Tasten über ein Array abzufragen.

    Spoiler anzeigen
    [autoit]

    #include <WindowsConstants.au3>
    ;=================================>
    Global $NumpadKeys[10] = [0,0,0,0,0,0,0,0,0,0]
    Local $NumpadLabels[10] ;eigentlich in disem fall egal ob global oder local, aber man will ja schön scripten
    ;==============>
    GUIRegisterMsg($WM_KEYDOWN, "ButtonDown")
    GUIRegisterMsg($WM_KEYUP, "ButtonUp")
    ;==========>
    $hGui = GUICreate("blub")
    GUISetState()
    For $i = 0 To 9
    $NumpadLabels[$i] = GUICtrlCreateLabel($i & " ist nicht gedrückt", 10, $i * 20)
    Next
    Do
    For $i = 0 To 9
    If $NumpadKeys[$i] Then ;es wäre einfacher und besser die Funktionsaufrufe direkt in die registrierten Funktionen zu schreiben, aber dies ist nur zur Darstellung der Verwendung
    GUICtrlSetData($NumpadLabels[$i], $i & " ist gedrückt")
    Else
    GUICtrlSetData($NumpadLabels[$i], $i & " ist nicht gedrückt")
    EndIf
    Next
    Sleep(20)
    until GUIGetMsg() = -3

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

    Func ButtonDown($hWnd, $Msg, $wParam, $lParam) ;in wParam ist die ID der Taste gespeichert
    If $wParam >= 0x60 and $wParam <=0x69 Then
    $NumpadKeys[Number($wParam-0x60)] = 1
    EndIf
    EndFunc

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

    Func ButtonUp($hWnd, $Msg, $wParam, $lParam)
    If $wParam >= 0x60 and $wParam <=0x69 Then
    $NumpadKeys[Number($wParam-0x60)] = 0
    EndIf
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von @night@ (22. Januar 2012 um 16:57)

  • Switch ist deshalb schneller als Select, weil es viele Werte jeweils mit nur einem anderen vergleichen muss. Wenn man Switch so benutzt wie $var, wird das mindestens genauso langsam wie Select sein.

    Ich empfehle, bei Spielen eher auf eventbasierte Lösungen (HotKeySet oder GUISetAccelerators) umzusteigen.

    Twitter: @L3viathan2142
    Benutze AutoIt persönlich nicht mehr, da ich keinen Windows-Rechner mehr besitze.