Seite 1 von 2

Tastenbelegung durch Benutzer veränderbar

Verfasst: 08.02.2010 13:24
von DerMeister
Hallo
Ich wollte, dass für ein Spiel die Tastenbelegung in einer eigenen Datei abgespeichert ist, und die dann geladen und im Spiel verwendet wird. (Mit den Preferences Befehlen)
Bloß habe ich das Problem, dass wenn ich zB um sich nach oben zu bewegen in der INI "Up" schreibe und es dann im Programm mit "#PB_Key_" + "Up" als Tastaturkonstanten verwenden will geht das ja nicht, da ich dann ja nur eben "#PB_Key_Up" als String habe, aber nicht die Zahl, wofür diese Konstante an sich steht.
Gibt es da noch eine einfachere Möglichkeit, als einfach alle Tastenmöglichkeiten durchzugehen
wie zB so (If TasteOben = "Up" (ausgelesen aus der INI) dann Key()\Oben = "#PB_Key_Up") ?

wie sieht deine INI denn aus...

Verfasst: 08.02.2010 13:57
von Kaeru Gaman
du musst sie ja in die INI erst mal reinbekommen.
wie schreibst du die denn da rein?

Re: Tastenbelegung durch Benutzer veränderbar

Verfasst: 08.02.2010 14:31
von hjbremer
so ähnlich

Code: Alles auswählen

Structure Tastenbelegung
   oben.i
   unten.i
   links.i
   rechts.i
   a.i
   b.i
   ;etc
EndStructure

Global key.Tastenbelegung

Procedure ReadKey(flag = 0)

ok = OpenPreferences("Key.ini")
If ok = 0: CreatePreferences("Key.ini"): EndIf   

If flag  ;schreiben

   PreferenceGroup("Keys")
   
   WritePreferenceLong("oben",  key\oben)
   WritePreferenceLong("unten", key\unten)
   ;usw.
   
Else     ;lesen

   PreferenceGroup("Keys")

   key\oben  = ReadPreferenceLong("oben",  #PB_Key_Up)
   key\unten = ReadPreferenceLong("unten", #PB_Key_Down)
   ;usw.
   
EndIf

ClosePreferences()

EndProcedure

ReadKey()  ;lesen
ReadKey(1) ;schreiben

per Array

Verfasst: 08.02.2010 15:33
von Kaeru Gaman
wie von hjbremer angedeutet, in die INI müssen nicht die Namen sondern die Scancodes der Tasten.

Allerdings würde ich nicht alle Kommando-Tasten in eine Struktur packen, sondern in ein strukturiertes Array.
erstens lassen sich Arrays mit Schleifen durchgehen, Strukturfelder nicht (nur begrenzt).
zweitens braucht man vielleicht zu den Keys noch mehr Infos.

hier mal ein Beispiel für Array- und Struktur-Aufbau und damit verbundener Abfrage.
das Einrichten und Speichern hab ich erst mal außen vor gelassen.

Code: Alles auswählen

Structure ComKeyINF
  ScnCode.i
  ComName.s
  KeyName.s
EndStructure

Enumeration 
  #ComKey_Up
  #ComKey_Down
  #ComKey_Left
  #ComKey_Right
  #ComKey_Fire
  #ComKey_Rocket
  #ComKey_Shield
  #ComKey_Warp
  
  #ComKey_Count
EndEnumeration

Dim CommandKey.ComKeyINF ( #ComKey_Count -1 )

CommandKey( #ComKey_Up     )\ScnCode = #PB_Key_Up
CommandKey( #ComKey_Up     )\KeyName = "Cursor Up"
CommandKey( #ComKey_Up     )\ComName = "Accellerate"

CommandKey( #ComKey_Down   )\ScnCode = #PB_Key_Down
CommandKey( #ComKey_Down   )\KeyName = "Cursor Down"
CommandKey( #ComKey_Down   )\ComName = "Reverse"

CommandKey( #ComKey_Left   )\ScnCode = #PB_Key_Left
CommandKey( #ComKey_Left   )\KeyName = "Cursor Left"
CommandKey( #ComKey_Left   )\ComName = "Turn Left"

CommandKey( #ComKey_Right  )\ScnCode = #PB_Key_Right
CommandKey( #ComKey_Right  )\KeyName = "Cursor Right"
CommandKey( #ComKey_Right  )\ComName = "Turn Right"

CommandKey( #ComKey_Fire   )\ScnCode = #PB_Key_Space
CommandKey( #ComKey_Fire   )\KeyName = "Space"
CommandKey( #ComKey_Fire   )\ComName = "Fire Laser"

CommandKey( #ComKey_Rocket )\ScnCode = #PB_Key_LeftAlt
CommandKey( #ComKey_Rocket )\KeyName = "Left Alt"
CommandKey( #ComKey_Rocket )\ComName = "Fire Rocket"

CommandKey( #ComKey_Shield )\ScnCode = #PB_Key_LeftControl
CommandKey( #ComKey_Shield )\KeyName = "Left Control"
CommandKey( #ComKey_Shield )\ComName = "Activate Shield"

CommandKey( #ComKey_Warp   )\ScnCode = #PB_Key_RightControl
CommandKey( #ComKey_Warp   )\KeyName = "Right Control"
CommandKey( #ComKey_Warp   )\ComName = "Warp Speed"


; ..........

ExamineKeyboard()

If KeyboardPushed( CommandKey( #ComKey_Up )\ScnCode )
  ; ** UP
EndIf

If KeyboardPushed( CommandKey( #ComKey_Down )\ScnCode )
  ; ** Down
EndIf

If KeyboardPushed( CommandKey( #ComKey_Left )\ScnCode )
  ; ** Left
EndIf

If KeyboardPushed( CommandKey( #ComKey_Right )\ScnCode )
  ; ** Right
EndIf
damit du die Namen der Tasten bei der Einrichtung der Steuerung durch den User zur Hand hast,
müsstest du die Benennung aller Tasten in einer DataSection mitgeben.

Re: Tastenbelegung durch Benutzer veränderbar

Verfasst: 08.02.2010 19:34
von DerMeister
Ja danke für die Tipps.
Ich hab jetz aber eher gemeint, ob ich irgendwie um die Schreibarbeit vorbeikomme, alle verschiedenen Tasten abzuschreiben, also zB so in der Art dass ich in der INI stehen habe "Oben" = 500 (was ja der Wert von #PB_Key_Up wäre) und das dann direkt so verwenden kann (Indem ich halt in meinem Programm schreibe, dass dieser Wert für die Nach Oben Bewegen Taste definiert ist). Das wäre aber nicht sehr benutzerfreundlich...
Deswegen wollte ich nur herausfinden ob es da einen Weg gibt ohne ellenlang in mein Programm jede unterschiedliche Taste hereinzuschreiben (also wie gesagt dass ich nicht immer schreiben muss wenn in der INI bei der NachOben Taste "Up" steht, dass es dann der Tastenwert #PB_Key_Up ist, falls dort steht "p" dass es dann #PB_Key_P ist usw... was ich ja für jede Taste schreiben müsste)

Mein Ziel war es, dass jmd. erstmal die Werte direkt in der INI verändern kann (zB zum Testen der EXE) wo er den Code ja nicht mehr verändern kann. Später kann ich es ja auch noch einrichten, dass man die Tastenbelegung im Menü umstellen kann (Mit Inkey wird das dann wohl leichter gehen).

Re: Tastenbelegung durch Benutzer veränderbar

Verfasst: 08.02.2010 19:48
von hjbremer
wenn du von außen über eine Ini oder was auch immer etwas verändern willst

dann mußt du vorher schreiben !!! :bounce:

Re: Tastenbelegung durch Benutzer veränderbar

Verfasst: 09.02.2010 16:51
von Kaeru Gaman
es gibt bisher keine fertige Include, die alle Tastennamen enthält.
ich hätts gestern beinahe gemacht, aber bin dann doch lieber in die Pinte gegangen.

ich würde mit diesem Gerüst anfangen:

Code: Alles auswählen

For t = 0 To 255 Step 8
  Out$ = "Data.s"
  For n = 0 To 6
    Out$ + " " + Chr(34) + "#" + RSet( Str(n+t), 3, "0" ) + Chr(34) + ","
  Next
  Out$ + " " + Chr(34) + "#" + RSet( Str(n+t), 3, "0" ) + Chr(34)
  Debug Out$
Next
pack den Debug-Output in die IDE, da hast du 32 Data-Zeilen mit insgesamt 256 Tastentexten.
jetzt bleibt dir nichts anderes übrig, als alle #PB_Key_ konstanten debuggen zu lassen (oder stehen die vielleicht sogar irgendwo in der Help?)
und die Namen manuell bei den Codes einzutragen.

Re: Tastenbelegung durch Benutzer veränderbar

Verfasst: 09.02.2010 18:21
von hjbremer
Auszug aus der Hilfe:

Code: Alles auswählen

#PB_Key_0
#PB_Key_1
#PB_Key_2
#PB_Key_3
#PB_Key_4
#PB_Key_5
#PB_Key_6
#PB_Key_7
#PB_Key_8
#PB_Key_9
#PB_Key_A
#PB_Key_Add
#PB_Key_All
#PB_Key_Apostrophe
#PB_Key_B
#PB_Key_Back
#PB_Key_BackSlash
#PB_Key_C
#PB_Key_Capital
#PB_Key_Comma
#PB_Key_D
#PB_Key_Decimal
#PB_Key_Delete
#PB_Key_Divide
#PB_Key_Down
#PB_Key_E
#PB_Key_End
#PB_Key_Equals
#PB_Key_Escape
#PB_Key_F
#PB_Key_F1
#PB_Key_F10
#PB_Key_F11
#PB_Key_F12
#PB_Key_F2
#PB_Key_F3
#PB_Key_F4
#PB_Key_F5
#PB_Key_F6
#PB_Key_F7
#PB_Key_F8
#PB_Key_F9
#PB_Key_G
#PB_Key_Grave
#PB_Key_H
#PB_Key_Home
#PB_Key_I
#PB_Key_Insert
#PB_Key_J
#PB_Key_K
#PB_Key_L
#PB_Key_Left
#PB_Key_LeftAlt
#PB_Key_LeftBracket
#PB_Key_LeftControl
#PB_Key_LeftShift
#PB_Key_M
#PB_Key_Minus
#PB_Key_Multiply
#PB_Key_N
#PB_Key_NumLock
#PB_Key_O
#PB_Key_P
#PB_Key_Pad0
#PB_Key_Pad1
#PB_Key_Pad2
#PB_Key_Pad3
#PB_Key_Pad4
#PB_Key_Pad5
#PB_Key_Pad6
#PB_Key_Pad7
#PB_Key_Pad8
#PB_Key_Pad9
#PB_Key_PadComma
#PB_Key_PadEnter
#PB_Key_PageDown
#PB_Key_PageUp
#PB_Key_Pause
#PB_Key_Period
#PB_Key_Q
#PB_Key_R
#PB_Key_Return
#PB_Key_Right
#PB_Key_RightAlt
#PB_Key_RightBracket
#PB_Key_RightControl
#PB_Key_RightShift
#PB_Key_S
#PB_Key_Scroll
#PB_Key_SemiColon
#PB_Key_Slash
#PB_Key_Space
#PB_Key_Subtract
#PB_Key_T
#PB_Key_Tab
#PB_Key_U
#PB_Key_Up
#PB_Key_V
#PB_Key_W
#PB_Key_X
#PB_Key_Y
#PB_Key_Z

Re: Tastenbelegung durch Benutzer veränderbar

Verfasst: 09.02.2010 18:23
von Kaeru Gaman
die stehen da ohne flax nur aufgezählt, ohne Werte?

nuja, nicht ganz so nutzlos wie ein zweiter Kropf, aber....

Re: Tastenbelegung durch Benutzer veränderbar

Verfasst: 09.02.2010 19:39
von CSHW89
Kaeru Gaman hat geschrieben:jetzt bleibt dir nichts anderes übrig, als alle #PB_Key_ konstanten debuggen zu lassen (oder stehen die vielleicht sogar irgendwo in der Help?)
PB-IDE -> Werkzeuge -> Strukturverzeichnis -> Konstanten -> "PB_Key" eingeben

lg kevin