Seite 1 von 1

Benutzerdefinierte Eingaben mit Keyboard IDs?

Verfasst: 03.04.2007 12:00
von D4uS1
So, ich deppscheff hab eine Tastaturabfrage so Programmiert das sie mit ASCII Werten arbeited. Das Problem ist das die ASCII Werte mit den Keyboard IDs ja nichts zu tun haben. Also passiert nichts wenn im Spiel die Taste gedrückt wird die der Benutzer selbst gewählt hat. Eigentlich wäre es kein Problem das umzuschreiben, nur bräuchte ich einen Begriff der die ID in einen String umwandelt. Wenn man z.B. Möchte das man mit W Vorwärts fährt, oder geht, oder schwimmt, hiernachdem welches Spiel man hat, das dann nicht in dem Feld für die Taste 17 steht, sondern w. Mit den ASCII Werten sind das die Begriffe ASC(Buchstabe) und CHR(Wert). Gibt es sowas auch für Keyboard IDs oder müsste ich jede Einzelne ID zuweisen, was eine sehr langfristige Arbeit wäre?

Verfasst: 03.04.2007 12:30
von Kaeru Gaman
eine funktion dafür ist mir nicht bekannt.
du könntest ein array aufstellen, was dir diese werte rückspeichert.
die tabelle selber müsste auch auf der MSDN einsehbar sein,
das dürfte schließlich auch die bezugstabelle für den 256byte-buffer von GetKeyboardState_() sein.

die tabelle findest du auch hier:
http://www.blitzbase.de/tabellen/scancodes.htm

...und irgendwo auf der PureArea war sie doch auch mal, oder?

Verfasst: 03.04.2007 14:24
von Sicro
Hallo St@ndFurz

Hier ein Beispiel:

Code: Alles auswählen

Procedure MyWindowCallback(WindowID,Message,wParam,lParam)
  Result = #PB_ProcessPureBasicEvents
  
  Select Message
    Case #WM_KEYDOWN
      Buffer.s = Space(255)
      GetKeyNameText_(lParam,@Buffer,Len(Buffer))
      SetGadgetText(0,Buffer)
    Case #WM_KEYUP
      SetGadgetText(0,"")
  EndSelect
  
  ProcedureReturn Result
EndProcedure

If OpenWindow(0,0,0,221,116,"Beispiel",#PB_Window_SystemMenu|#PB_Window_TitleBar|#PB_Window_ScreenCentered)
  If CreateGadgetList(WindowID(0))
    TextGadget(0,1,1,221,116,"",#PB_Text_Border|#PB_Text_Center)
  EndIf
  
  SetWindowCallback(@MyWindowCallback())
  Repeat: Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Mfg DerProgger

Verfasst: 03.04.2007 22:52
von D4uS1
danke, das kann ich auch gebrauchen, aber das Problem ist eigentlich das ich das ganze in einem Screen habe, und somit die Abfragen per KeyboardInkey machen muss. Und da dieses nunmal einen String verlangt, ist es offensichtlich nicht möglich dies in die IDs umzuwandeln ausser jeden Buchstaben zu beziehen, ich würde mir auch die Zeit dafür nehmen, aber wenn es eine Möglichkeit gäbe das einfacher zu machen, dann wäre ich doch wesentlich froher^^!

Verfasst: 04.04.2007 09:31
von Kaeru Gaman
> und somit die Abfragen per KeyboardInkey machen muss.

das ist so nicht ganz richtig.

du hast doch auch die funktion KeyboardPushed()
diese erwartet genau den scancode.

wenn du jetzt ein array aufsetzt für deine funktionen, und darein die verknüpften scancodes schreibst....

also, mal angenommen in deinem array KeyCodes() bedeutet das Feld (1) die funktion "Player nach rechts"
dann schreibst du in KeyCodes(1) den keycode für die rechts-steuerung.
für WASD dann KeyCodes(1) = #PB_Key_D,
für cursortasten dann KeyCodes(1) = #PB_Key_Right
später in deiner Programmschleife fragst du ab
If KeyboardPushed(KeyCodes(1))
damit reagierst du auf cursor-right oder auf D, je nachdem welche steuerung der spieler eingestellt hat.

Verfasst: 09.04.2007 12:42
von D4uS1
So den Array habe ich jetzt erstellt. Bitte verurteilt mich nicht wenn ich jetzt ne dumme Frage stelle, aber wie setze ich die Variable gleich? Da Der Begriff Keyboardpushed() einen Rückgabewert hat, wird mir nur 1 oder 0 übernommen. und dann kann ich plötzlich mit escape eine Rechtsbewegung machen :wink:

Verfasst: 09.04.2007 14:25
von Sicro
Neuer Versuch :mrgreen:

Code: Alles auswählen

Dim Keys(4)

Keys(0) = #PB_Key_Up
Keys(1) = #PB_Key_Down
Keys(2) = #PB_Key_Left
Keys(3) = #PB_Key_Right
Keys(4) = #PB_Key_Escape

If Not InitSprite() Or Not InitKeyboard()
  End
EndIf

If OpenScreen(800,600,16,"test")
  Repeat
    ClearScreen(#Black)
    ExamineKeyboard()
    
    For i = 0 To 4
      If KeyboardPushed(Keys(i))
        If StartDrawing(ScreenOutput())
          Select i
            Case 0: DrawText(400,300,"nach oben laufen")
            Case 1: DrawText(400,300,"nach unten laufen")
            Case 2: DrawText(400,300,"nach links laufen")
            Case 3: DrawText(400,300,"nach rechts laufen")
          EndSelect
          StopDrawing()
        EndIf
        
        If i = 4: Break 2: EndIf
        Break
      EndIf
    Next
    
    FlipBuffers()
    Delay(10)
  ForEver
  
  CloseScreen()
EndIf
Mfg DerProgger

Verfasst: 09.04.2007 14:48
von D4uS1
ok danke :mrgreen: