Neue Keyboard-Funktion: KeyboardTyping(KeyID)

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Lebostein
Beiträge: 674
Registriert: 13.09.2004 11:31
Wohnort: Erzgebirge

Neue Keyboard-Funktion: KeyboardTyping(KeyID)

Beitrag von Lebostein »

In PureBasic gibt es ja die zwei Funktionen KeyboardPushed() und KeyboardReleased(). Für eine Menüführung beispielsweise, würde KeyboardPushed() nicht viel nützen, da diese Funktion immer einen Wert zurückgibt, solange die Taste gedrückt ist. KeyboardReleased() ist hier schon besser, da die Funktion immer genau dann den Wert zurückgibt, wenn die Taste losgelassen wurde, also einmalig. Wem das nicht gefällt, wenn eine Reaktion erst nach dem Loslassen erfolgt, kann die kleine Include-Datei hier unten einbinden. Mit dem Befehl KeyboardTyping() wird dann ein einmaliges Ereignis genau beim Drücken der Taste ausgelöst, so wie man es bei vielen Spielen/Programmen gewohnt ist:

Code: Alles auswählen

;**************************************************************
;* INCLUDE FOR PUREBASIC 3.92
;**************************************************************
;* Titel: KeyboardTyping
;* Autor: Lebostein
;* Datum: 13.01.2005
;**************************************************************

;==============================================================
; Variablen und Konstanten der Include-Datei
;==============================================================

NewList PushedKeys.l()

;==============================================================
; Entfernt Einträge von Tasten, die losgelassen wurden
;==============================================================

Procedure ExamineKeyboardTyping()

  ForEach PushedKeys(): If KeyboardPushed(PushedKeys()) = 0: DeleteElement(PushedKeys()): EndIf: Next

EndProcedure

;==============================================================
; Gibt einmalig 1 zurück, wenn Taste niedergedrückt wird
;==============================================================

Procedure KeyboardTyping(code)

  If KeyboardPushed(code) = 0: ProcedureReturn: EndIf
  ForEach PushedKeys(): If PushedKeys() = code: exist = 1: EndIf: Next
  If exist = 0: AddElement(PushedKeys()): PushedKeys() = code: ProcedureReturn 1: EndIf

EndProcedure

;==============================================================
; Ende der Include-Datei
;==============================================================



;---------------------------- Schnitt ----------------------------------

; Hier ein kleines Beispiel:

InitSprite() 
InitKeyboard() 
OpenScreen(800,600,16,"KeyboardTyping")

status = 1

Repeat 

ExamineKeyboard() 
ExamineKeyboardTyping()

If KeyboardTyping(#PB_Key_Up)   And status > 1: status - 1: EndIf
If KeyboardTyping(#PB_Key_Down) And status < 6: status + 1: EndIf

ClearScreen(0,0,0)
StartDrawing(ScreenOutput())
  DrawingMode(1)
  For eintrag = 1 To 6
  If eintrag = status: FrontColor(255,0,0): Else: FrontColor(255,255,255): EndIf
  Locate(100, eintrag * 20)
  Select eintrag
  Case 1: DrawText("Spiel starten")
  Case 2: DrawText("Einstellungen")
  Case 3: DrawText("Credits")
  Case 4: DrawText("Handbuch lesen")
  Case 5: DrawText("Leveleditor starten")
  Case 6: DrawText("Spiel verlassen")
  EndSelect
  Next eintrag
StopDrawing()
FlipBuffers()

Until KeyboardTyping(#PB_Key_Escape)

Viel Spaß damit