Page 1 sur 1

OpenGLGadget : Evènement clavier

Publié : ven. 14/mars/2025 11:31
par falsam
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.

:arrow: Module ToucanKeyboard.mod.pbi

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

:arrow: 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.

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

Re: OpenGLGadget : Evènement clavier

Publié : ven. 21/mars/2025 20:38
par venom
Merci pour le partage falsam.

Si j'ai bien suivi en ce moment tu boss sur OpenGL pour purebasic. D'où ces codes ?

Je testerai ça quand je serai sur l'ordi






@++

Re: OpenGLGadget : Evènement clavier

Publié : ven. 21/mars/2025 22:41
par falsam
Bonjour Venom. Effectivement je teste l'OpenGLgadget et j'avais besoin d'avoir un accès simple et rapide au clavier sous OpenGL.

Peut être que je me lancerais dans un module (J'ai déja un embryon que je teste) pour les jeux 2D sous OpenGL. J'inclurais mon gestionnaire de clavier dans ce module. A suivre .....

Re: OpenGLGadget : Evènement clavier

Publié : mar. 01/avr./2025 17:04
par venom
Oh vivement la suite alors :P
:oops: désolé en ce moment je passe chez moi en coup de vent. Je vais pouvoir tester le code demain soir si tout va bien :roll:







@++

Re: OpenGLGadget : Evènement clavier

Publié : mar. 01/avr./2025 18:56
par Ar-S
@falsam. CoOl :mrgreen:

Re: OpenGLGadget : Evènement clavier

Publié : mer. 02/avr./2025 20:41
par venom
Bon j'ai testé le code, Il fonctionne sous purebasic 6.20 x64.
par contre en commentaire tu note que la fenêtre peut être fermer avec :
Escape, Ctrl-A, Shift-B et Alt-Q seul escape fonctionne. surement par ce que tu as mis uniquement #PB_Shortcut_Escape ??

pour le reste c'est ok :wink:






@++