Tastenbelegung durch Benutzer veränderbar

Anfängerfragen zum Programmieren mit PureBasic.
DerMeister
Beiträge: 28
Registriert: 30.12.2009 19:20

Tastenbelegung durch Benutzer veränderbar

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

wie sieht deine INI denn aus...

Beitrag von Kaeru Gaman »

du musst sie ja in die INI erst mal reinbekommen.
wie schreibst du die denn da rein?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: Tastenbelegung durch Benutzer veränderbar

Beitrag 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
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

per Array

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
DerMeister
Beiträge: 28
Registriert: 30.12.2009 19:20

Re: Tastenbelegung durch Benutzer veränderbar

Beitrag 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).
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: Tastenbelegung durch Benutzer veränderbar

Beitrag 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:
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Tastenbelegung durch Benutzer veränderbar

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: Tastenbelegung durch Benutzer veränderbar

Beitrag 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
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Tastenbelegung durch Benutzer veränderbar

Beitrag von Kaeru Gaman »

die stehen da ohne flax nur aufgezählt, ohne Werte?

nuja, nicht ganz so nutzlos wie ein zweiter Kropf, aber....
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: Tastenbelegung durch Benutzer veränderbar

Beitrag 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
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Antworten