OpenGLGadget : Evènement clavier

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

OpenGLGadget : Evènement clavier

Message 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
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
venom
Messages : 3128
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: OpenGLGadget : Evènement clavier

Message 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






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: OpenGLGadget : Evènement clavier

Message 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 .....
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
venom
Messages : 3128
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: OpenGLGadget : Evènement clavier

Message 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:







@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: OpenGLGadget : Evènement clavier

Message par Ar-S »

@falsam. CoOl :mrgreen:
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
venom
Messages : 3128
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: OpenGLGadget : Evènement clavier

Message 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:






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Répondre