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

Verfasst: 09.04.2007 14:25
von Sicro
Neuer Versuch
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
