OpenGLGadget : Evènement clavier
Publié : ven. 14/mars/2025 11:31
ToucanKeyboard.mod.pbi est un petit module pour tester les évènements clavier de l'OpenGLgadget.
Deux fonctionnalités :
■ KeyPushed(OpenGLGadget.i, ToucheID.i, Modifiers.i=0) pour tester l'état enfoncé ou non d'une touche ou combinaison de touches du clavier.
■ KeyReleased(OpenGLGadget.i, ToucheID.i, Modifiers.i=0) pour tester l'état relâché ou non d'une touche ou combinaison de touches du clavier.
Module ToucanKeyboard.mod.pbi
Avec ce code de test, vous allez utiliser les flèches du clavier pour déplacer un sprite représenté par un carré jaune. La touche Escape fermera la fenêtre et mettra fin à ce test.
Deux fonctionnalités :
■ KeyPushed(OpenGLGadget.i, ToucheID.i, Modifiers.i=0) pour tester l'état enfoncé ou non d'une touche ou combinaison de touches du clavier.
■ KeyReleased(OpenGLGadget.i, ToucheID.i, Modifiers.i=0) pour tester l'état relâché ou non d'une touche ou combinaison de touches du clavier.

Code : Tout sélectionner
; ToucanKeyBoard.mod.pbi - Version 1.0 - Codé avec PureBasic 6.20
;
; Tester les évenements clavier
;
; Création : 13 Mars 2025
; Auteur : falsam
;
DeclareModule ToucanKeyBoard
Declare KeyPushed(Gadget.i, ToucheID.i, Modifiers.i=0)
Declare KeyReleased(Gadget.i, ToucheID.i, Modifiers.i=0)
EndDeclareModule
Module ToucanKeyBoard
EnableExplicit
; Stocke les touches ou combinaisons de touches actuellement pressées
Global NewMap KeysPressed.i()
;- PUBLIC
;-
; KeyPushed() : Tester l'état enfoncé ou non d'une touche ou combinaison de touches du clavier.
;
; Parametre :
; OpenGLGadget Identifiant du gadget OpenGL
; ToucheID Identifiant PureBasic de la touche à tester
; Modifiers Identifiant(s) de combinaison de touche(s) avec Ctrl, ALt et Shift
;
; Valeur de retour:
; Renvoie une valeur non nulle ou zéro
;
Procedure KeyPushed(OpenGLGadget.i, ToucheID.i, Modifiers.i=0)
Protected TestKey.i, TestModifiers.i, Result.b
; Mémorisation de la touche clavier à tester
TestKey = GetGadgetAttribute(OpenGLGadget, #PB_OpenGL_Key)
; La touche est elle combinée avec la touche Ctrl ou Shift ou ALt ?
TestModifiers = GetGadgetAttribute(OpenGLGadget, #PB_OpenGL_Modifiers)
If TestKey = ToucheID And TestModifiers = Modifiers
Select EventType()
Case #PB_EventType_KeyDown
If Not FindMapElement(KeysPressed(), Str(TestKey))
KeysPressed(Str(TestKey)) = TestModifiers
EndIf
Case #PB_EventType_KeyUp
If FindMapElement(KeysPressed(), Str(TestKey))
DeleteMapElement(KeysPressed())
EndIf
EndSelect
EndIf
; Validation de la touche ou combinaison de touches préssée
ForEach KeysPressed()
If ToucheID = Val(MapKey(KeysPressed())) And TestModifiers = KeysPressed()
Result = #True
Break
EndIf
Next
ProcedureReturn Result
EndProcedure
; KeyReleased() : Tester l'état relâché ou non d'une touche ou combinaison de touches du clavier.
;
; Parametre :
; OpenGLGadget Identifiant du gadget OpenGL
; ToucheID Identifiant PureBasic de la touche à tester
; Modifiers Identifiant(s) de combinaison de touche(s) avec Ctrl, ALt et Shift
;
; Valeur de retour:
; Renvoie une valeur non nulle ou zéro
;
Procedure KeyReleased(OpenGLGadget.i, ToucheID.i, Modifiers.i=0)
Static PreviousTestKey.i, PreviousTestModifiers.i
Protected TestKey.i, TestModifiers.i, Result.b
; Mémorisation de la touche clavier à tester
TestKey = GetGadgetAttribute(OpenGLGadget, #PB_OpenGL_Key)
; La touche est elle combinée avec la touche Ctrl ou Shift ou ALt ?
TestModifiers = GetGadgetAttribute(OpenGLGadget, #PB_OpenGL_Modifiers)
If PreviousTestKey <> TestKey
PreviousTestKey = TestKey
EndIf
If PreviousTestModifiers <> TestModifiers
PreviousTestModifiers = TestModifiers
EndIf
If PreviousTestKey = ToucheID And PreviousTestModifiers = Modifiers
Select EventType()
Case #PB_EventType_KeyUp
PreviousTestKey = -1
PreviousTestModifiers = -1
Result = #True
EndSelect
EndIf
ProcedureReturn Result
EndProcedure
EndModule

Code : Tout sélectionner
EnableExplicit
XIncludeFile "ToucanKeyboard.mod.pbi"
UseModule ToucanKeyBoard
; Fenetre principale Viewport et couleur arriere plan
Global Window, ww = 800, wh = 600
; Viewport (OpenGLgadget)
Global Viewport, vColor.f = RGB(107, 142, 35)
; Sprite
Global sx.f = 100, sy.f =100, sw = 64, sh = 64, sColor = RGB(255, 215, 0)
;Plan de l'application
Declare Start()
Declare GameEvent()
Declare GameRender()
Declare Exit()
Start()
Procedure Start()
Window = OpenWindow(#PB_Any, 0, 0, ww, wh, "Test Opengl", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
; Fenetre Open GL
Viewport = OpenGLGadget(#PB_Any, 0, 0, ww, wh, #PB_OpenGL_Keyboard)
SetActiveGadget(Viewport)
; Modifier le contexte courant
SetGadgetAttribute(Viewport, #PB_OpenGL_SetContext, #True)
; Couleur d'arrirer plan
glClearColor_(Red(vColor)/255, Green(vColor)/255, Blue(vColor)/255, 1.0)
; Volume de visualisation
glMatrixMode_(#GL_PROJECTION)
glLoadIdentity_();
gluOrtho2D_(0, ww, wh, 0)
;Triggers
BindEvent(#PB_Event_CloseWindow, @Exit())
;Loop
Repeat
GameEvent()
GameRender()
Until WindowEvent() = #PB_Event_CloseWindow
EndProcedure
; Evenements clavier de la scene
;- Les fleches pour déplacer le sprite
;- Escape, Ctrl-A, Shift-B et Alt-Q pour quiter l'application
Procedure GameEvent()
Protected Speed.f = 8
;-Déplacement du sprite
If KeyPushed(Viewport, #PB_Shortcut_Left) And sx > Speed
sx - Speed
EndIf
If KeyPushed(Viewport, #PB_Shortcut_Right) And sx + sw + Speed < ww
sx + Speed
EndIf
If KeyPushed(Viewport, #PB_Shortcut_Up) And sy > Speed
sy - Speed
EndIf
If KeyPushed(Viewport, #PB_Shortcut_Down) And sy + sh + speed < wh
sy + Speed
EndIf
;-Quitter l'application
If KeyReleased(Viewport, #PB_Shortcut_Escape)
Exit()
EndIf
EndProcedure
; Rendu de la scene OpenGl
Procedure GameRender()
; ClearScreen
glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT)
; Affichage d'un carré
glMatrixMode_(#GL_MODELVIEW) ;Initialiser la matrice de transformation courante
glPushMatrix_()
glBegin_(#GL_POLYGON)
glColor3f_(Red(sColor)/255, Green(sColor)/255, Blue(sColor)/255)
glVertex2i_(sx, sy) ;Point haut gauche
glVertex2i_(sx + sw, sy) ;Point haut droit
glVertex2i_(sx + sw, sy + sh) ;Point bas droit
glVertex2i_(sx, sy + sh) ;Point bas gauche
glEnd_() ;Fin du polygone
glPopMatrix_();
; Flip buffer
SetGadgetAttribute(Viewport, #PB_OpenGL_FlipBuffers, #True)
EndProcedure
Procedure Exit()
End
EndProcedure