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