Benutzerdefinierte Eingaben mit Keyboard IDs?

Anfängerfragen zum Programmieren mit PureBasic.
D4uS1
Beiträge: 268
Registriert: 02.09.2006 12:16

Benutzerdefinierte Eingaben mit Keyboard IDs?

Beitrag 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?
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Sicro
Beiträge: 964
Registriert: 11.08.2005 19:08
Kontaktdaten:

Beitrag 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
D4uS1
Beiträge: 268
Registriert: 02.09.2006 12:16

Beitrag 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^^!
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
D4uS1
Beiträge: 268
Registriert: 02.09.2006 12:16

Beitrag 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:
Benutzeravatar
Sicro
Beiträge: 964
Registriert: 11.08.2005 19:08
Kontaktdaten:

Beitrag 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
D4uS1
Beiträge: 268
Registriert: 02.09.2006 12:16

Beitrag von D4uS1 »

ok danke :mrgreen:
Antworten