Tastenauswahl

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

cavebird

Betreff: Tastenauswahl

BeitragMo, Jun 07, 2004 19:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Hat vielleicht einer einen kleinen Code, wo man mit Tastendruck auswählen kann welche Taste für z.B. schießen ist? Ich frage nur weil ich seit 3 tagen versuche so etwas zu proggen aber...ich bin *dumm*-*dumm!!!* Mad

rambo256

BeitragMo, Jun 07, 2004 19:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Probiers mal mit Getkey() oder so und speicher den Wert in eine Variable ab.
Asus F53z

Das Leben ist eine reine Konkatenation...
 

cavebird

BeitragMo, Jun 07, 2004 20:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Das habe ich doch alles schon probiert...ich sage nur brett vorm kopf....

[edit]hmm...ich kiffe seit 3 Tagen...hmm seit 3 tagen bin ich dumm...[/edit]
 

Edlothiol

BeitragMo, Jun 07, 2004 20:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Lieber nicht GetKey.
Code: [AUSKLAPPEN]
While Not Keyhit(1)
  For i = 2 To 237
    If Keyhit(i) Then
      Print "Neue Tastaturbelegung festlegen auf Taste mit Scancode: " + i
    End If
  Next
Wend
Der Rest sollte ja nicht allzu schwer sein.

ChrisAttack

BeitragMo, Jun 07, 2004 20:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]

global key_shoot

...

function auswahl(key)
repeat
text 0,50,"Tastaturbelegung für Schiessen: "
key = getkey()
until (key <> 0)
end function

...

graphics 800,600,16,1
setbuffer backbuffer()

auswahl key_shoot

repeat

if keydown(key_shoot)=1 then shoot_gegner_weg

until spiel_zu_ende

B3D
MSVC++
DX9SDK
 

Edlothiol

BeitragMo, Jun 07, 2004 20:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Argh. Das kann gar nicht klappen, ChrisAttack. Erstens gibt GetKey keine Scan - sondern ASCII - Codes zurück, und zweitens kannst du keine Globalen "als Parameter übergeben".

ChrisAttack

BeitragMo, Jun 07, 2004 20:43
Antworten mit Zitat
Benutzer-Profile anzeigen
stimmt. aber das hier klappt...

Code: [AUSKLAPPEN]

global guiEingabe$

;Input
function guiInput(x,y,w,h)
color 255,255,255
rect x,y,w,h,1
if MouseOver(x,y,w,h) and stringwidth(guiEingabe$)< (w-11) then
color 0,0,0
A = GetKey()
if A > 31 then guiEingabe$ = guiEingabe$ + chr$(A)
endif
color 0,0,0
text x,y, guiEingabe$ + "_"
end function

;MouseOver
Function MouseOver(x,y,w,h)
 If MouseX() > x And MouseX() < x+w And MouseY() > y And MouseY() < y+h Then Return 1
End Function


graphics 800,600,32,2
setbuffer backbuffer()


repeat
cls

guiInput(100,100,200,50)

flip
until keyhit(1)



B3D
MSVC++
DX9SDK
 

cavebird

BeitragMo, Jun 07, 2004 21:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Edlothiol: Danke dein Code funktioniert.
ChrisAttack: Ich verstehe nicht, was dein 2. Skript bringt.

Hubsi

BeitragDi, Jun 08, 2004 8:55
Antworten mit Zitat
Benutzer-Profile anzeigen
@ChrisAttack: siehe Dein eigenes Avatar Razz
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

ChrisAttack

BeitragDi, Jun 08, 2004 11:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Embarassed jaja... das erste hab ich nur so hingeschrieben ohne drüber nachzudenken *selber auf kopf hau* sry
B3D
MSVC++
DX9SDK

Travis

BeitragSo, Jul 25, 2004 13:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich krame diesen Thread mal wieder heraus, weil ich für meine Frage nicht extra einen Neuen eröffnen möchte.

Ich habe für ein Spiel eine benutzerdefinierbare Steuerung programmiert. Weil die Befehle KeyHit und KeyDown mit den ScanCodes arbeiten, habe ich also diese abgefragt. Jetzt muss ich diese ScanCodes zur Anzeige der verwendeten Taste aber irgendwie wieder zurückwandeln. Gibt es da eine elegantere Methode als eine Funktion zu schreiben und jedem ScanCode selbst eine Bezeichnung zuzuweisen?

Und dann würde mich noch interessieren, warum ich die Codes für die Funktions- und Steuerungstasten nicht abfragen kann.

Zum Abfragen benutze ich diesen Code hier:
Code: [AUSKLAPPEN]

  If ConfigureMenu = 1 Then ; Vorwärts
   ConfigureSelectorY =  -((140+y)*2)+768
   If KeyHit(28) Then
    FlushKeys()
    WaitKey()
    For i = 2 To 237
     If KeyHit(i) Then KeyForwards = i
    Next
   EndIf   
  EndIf


Wird also ein Menüpunkt angewählt und mit Enter bestätigt, dann kann die neue Taste gedrückt werden. Die Schleife prüft dann, welchen Scancode die Taste hatte. Das funktioniert mit einigen Tasten aber leider nicht.
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.
 

Jake

BeitragSo, Jul 25, 2004 14:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Habs gerade mal ausprobiert, das Problem ist Waitkey().

So gehts:

Code: [AUSKLAPPEN]

 Repeat 
  If KeyHit(28) Then
    FlushKeys()
    KeyForwards=0
    Repeat
    For i = 2 To 237
     If KeyHit(i) Then KeyForwards = i
    Next
    Until KeyForwards>0
    DebugLog KeyForwards
   EndIf   
Forever   


Andere Frage ist, warum Waitkey da Probleme macht. Bei deiner Version gehen z.B. die normalen Cursortasten, die auf dem Nummernblock nicht.

Travis

BeitragSo, Jul 25, 2004 15:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Aha, WaitKey reagiert auf gewisse Tasten nicht. Dann könnte man es auch so machen, aber deine Lösung gefällt mir besser.

Unnötig zu sagen, das das nicht gerade schön ist.

Code: [AUSKLAPPEN]

  If ConfigureMenu = 2 Then ; Rückwärts
   ConfigureSelectorY =  -((160+y)*2)+768
   If KeyHit(28) Then
    FlushKeys()
    Repeat
     For i = 2 To 237
      If KeyHit(i) Then KeyBackwards = i: Exit
     Next
     If KeyBackwards = i Then Exit
    Forever
   EndIf
  EndIf


Naja, egal. Solange es funktioniert könnte ich mit dieser Methode leben. Aber wie wandle ich diese ScanCodes jetzt in Buchstaben zurück. Muss ich wirklich eine Funktion schreiben, die jeden einzelnen ScanCode übersetzt?
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.
  • Zuletzt bearbeitet von Travis am So, Jul 25, 2004 15:42, insgesamt einmal bearbeitet
 

Edlothiol

BeitragSo, Jul 25, 2004 15:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Eigentlich schon, allerdings hat das glaube ich schon jemand bei BlitzCoder gemacht...

Edit: Habs gefunden: http://www.blitzcoder.com/cgi-...omments=no
Nur ist das eben alles auf Englisch...
 

Jake

BeitragSo, Jul 25, 2004 15:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich mach das bei mir zweigleisig, d.h. ich frage "normale" Tasten als Ascii ab, und Sondertasten über Scancodes, die ich über Bits maskiere:

Code: [AUSKLAPPEN]

type Shortcut
  Key%     ; Ascii
  KeyEx% ; Scancode
end type


Das ist wahrscheinlich nicht weniger aufwändig als nen Scancode in Ascii zurückzuwandeln, aber so kann ich Mehrfachkombinationen schön verpacken.

Travis

BeitragSo, Jul 25, 2004 16:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Für meine Sache brauche ich eine Funktion, die den ScanCode direkt übersetzt.

Weil ich ziemlich Tippfaul bin, habe ich mal versucht das zu automatisieren. Die Liste wird automatisch erstellt. Man drückt eine Taste und dann gibt man einfach die Bezeichnung ein. Und weil der Puffer nicht gelöscht ist, steht der korrekte Buchstabe schon da und man braucht nur noch Enter drücken! Leider reagiert die Inputroutine nicht auf alle Tasten, so kann man z.B. kein ` eingeben.

Code: [AUSKLAPPEN]

Datei = WriteFile("Translator.bb")

Repeat
Cls

 Text 0,20, "Drücken Sie eine Taste!"

  FlushKeys()
  Tastendruck = 0
  Repeat
   For i = 2 To 237
    If KeyHit(i) Then Tastendruck = i
   Next
  Until Tastendruck <> 0
   
  Bezeichnung$ = Input("Welche Taste haben Sie gedrückt?")
  If Bezeichnung$ = "-1" Then End

  WriteLine Datei, "IF ScanCode = " + Tastendruck + " Then Return " + Chr(34) + Bezeichnung + Chr$(34)

Flip
Forever
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.
 

Edlothiol

BeitragSo, Jul 25, 2004 17:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie gesagt, schau dir http://www.blitzcoder.com/cgi-...omments=no das mal an, da sind die Tastennamen in einem Array gespeichert. Das zu übersetzen ist immerhin besser als es nochmal völlig neu zu schreiben.

Travis

BeitragSo, Jul 25, 2004 17:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, jetzt habe ich herausgefunden, wie das ganze funktioniert. Es hat mich ziemlich irritiert, das die Arrays kein $-Zeichen haben und trotzdem einen String enthalten.

EDIT: Da fällt mir gerade ein, ich will mein Spiel ja sowieso in englischer Sprache halten. Die Funktion ist genau das was ich gesucht habe. Danke!

PS: [Flüster]Wie heisst eigentlich diese Taste links neben dem A?[/Flüster]

Code: [AUSKLAPPEN]

Function TastenBezeichnung$(ScanCode)
 If ScanCode = 59 Then Return "F1"
 If ScanCode = 60 Then Return "F2"
 If ScanCode = 61 Then Return "F3"
 If ScanCode = 62 Then Return "F4"
 If ScanCode = 63 Then Return "F5"
 If ScanCode = 64 Then Return "F6"
 If ScanCode = 65 Then Return "F7"
 If ScanCode = 66 Then Return "F8"
 If ScanCode = 67 Then Return "F9"
 If ScanCode = 68 Then Return "F10"
 If ScanCode = 68 Then Return "F11"
 If ScanCode = 88 Then Return "F12"
 If ScanCode = 70 Then Return "Rollen"
 If ScanCode = 69 Then Return "Pause"
 If ScanCode = 41 Then Return "°"
 If ScanCode = 2 Then Return "1"
 If ScanCode = 3 Then Return "2"
 If ScanCode = 4 Then Return "3"
 If ScanCode = 5 Then Return "4"
 If ScanCode = 6 Then Return "5"
 If ScanCode = 7 Then Return "6"
 If ScanCode = 8 Then Return "7"
 If ScanCode = 9 Then Return "8"
 If ScanCode = 10 Then Return "9"
 If ScanCode = 11 Then Return "0"
 If ScanCode = 12 Then Return "ß"
 If ScanCode = 13 Then Return ""
 If ScanCode = 14 Then Return "Backspace"
 If ScanCode = 15 Then Return "Tabulator"
 If ScanCode = 16 Then Return "Q"
 If ScanCode = 17 Then Return "W"
 If ScanCode = 18 Then Return "E"
 If ScanCode = 19 Then Return "R"
 If ScanCode = 20 Then Return "T"
 If ScanCode = 21 Then Return "Z"
 If ScanCode = 22 Then Return "U"
 If ScanCode = 23 Then Return "I"
 If ScanCode = 24 Then Return "O"
 If ScanCode = 25 Then Return "P"
 If ScanCode = 26 Then Return "Ü"
 If ScanCode = 27 Then Return "+"
 If ScanCode = 30 Then Return "A"
 If ScanCode = 31 Then Return "S"
 If ScanCode = 32 Then Return "D"
 If ScanCode = 33 Then Return "F"
 If ScanCode = 34 Then Return "G"
 If ScanCode = 35 Then Return "H"
 If ScanCode = 36 Then Return "K"
 If ScanCode = 37 Then Return "K"
 If ScanCode = 38 Then Return "L"
 If ScanCode = 39 Then Return "Ö"
 If ScanCode = 40 Then Return "Ä"
 If ScanCode = 86 Then Return "<"
 If ScanCode = 44 Then Return "Y"
 If ScanCode = 45 Then Return "X"
 If ScanCode = 46 Then Return "C"
 If ScanCode = 47 Then Return "V"
 If ScanCode = 48 Then Return "B"
 If ScanCode = 49 Then Return "N"
 If ScanCode = 50 Then Return "M"
 If ScanCode = 51 Then Return ","
 If ScanCode = 52 Then Return "."
 If ScanCode = 53 Then Return "-"
 If ScanCode = 42 Then Return "Linke Shift"
 If ScanCode = 54 Then Return "Rechte Shift"
 If ScanCode = 43 Then Return "#"
 If ScanCode = 29 Then Return "Linke Strg"
 If ScanCode = 219 Then Return "Linke Windows"
 If ScanCode = 56 Then Return "Linke Alt"
 If ScanCode = 57 Then Return "Leertaste"
 If ScanCode = 184 Then Return "Alt Gr"
 If ScanCode = 220 Then Return "Rechte Windows"
 If ScanCode = 221 Then Return "Startmenü"
 If ScanCode = 157 Then Return "Rechte Strg"
 If ScanCode = 210 Then Return "Einf"
 If ScanCode = 199 Then Return "Pos1"
 If ScanCode = 201 Then Return "Bild auf"
 If ScanCode = 211 Then Return "Entf"
 If ScanCode = 207 Then Return "Ende"
 If ScanCode = 209 Then Return "Bild ab"
 If ScanCode = 200 Then Return "Pfeil hoch"
 If ScanCode = 203 Then Return "Pfeil links"
 If ScanCode = 205 Then Return "Pfeil rechts"
 If ScanCode = 208 Then Return "Pfeil runter"
 If ScanCode = 197 Then Return "Num"
 If ScanCode = 181 Then Return "/ Ziffernblock"
 If ScanCode = 55 Then Return "* Ziffernblock"
 If ScanCode = 74 Then Return "- Ziffernblock"
 If ScanCode = 71 Then Return "7 Ziffernblock"
 If ScanCode = 72 Then Return "8 Ziffernblock"
 If ScanCode = 73 Then Return "9 Ziffernblock"
 If ScanCode = 75 Then Return "4 Ziffernblock"
 If ScanCode = 76 Then Return "5 Ziffernblock"
 If ScanCode = 77 Then Return "6 Ziffernblock"
 If ScanCode = 79 Then Return "1 Ziffernblock"
 If ScanCode = 80 Then Return "2 Ziffernblock"
 If ScanCode = 81 Then Return "9 Ziffernblock"
 If ScanCode = 82 Then Return "0 Ziffernblock"
 If ScanCode = 83 Then Return ", Ziffernblock"
 If ScanCode = 156 Then Return "Enter"
 If ScanCode = 78 Then Return "+ Ziffernblock"
 If ScanCode = 28 Then Return "Return"
End Function
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.
 

Ensign Joe

BeitragSo, Jul 25, 2004 21:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Caps Lock
Ich habe jetzt eine Pommesbude aufgemacht am Münchner Hauptbahnhof.
Und da ich Herbert Görgens heiße, heißt diese Pommesbude
Herbert's Pommesbude Smile

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group