Gadget OpenGL : Utilisation du clavier

Sujets variés concernant le développement en PureBasic
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Gadget OpenGL : Utilisation du clavier

Message par falsam »

@crisot : Merci pour cette solution. Je pense que le mieux serait de dissocier la bibliothèque keyboard de la bibliothèque screen ;)
crisot a écrit :(Et arrêtez avec Delay(), cette instruction n'existe pas )
Tout à fait d'accord ^^

J'ai codé un petit module (keyboard.mod.pbi) pour tester les touches mais avec quelques API.

■ Deux fonctions

InitKey(mode = #PB_Ignore)
Initialiser le module avec la topologie du clavier

KeyPress(value, released.b = #False)
Tester si une touche est pressée ou relâchée (released = #True)

■ Le code en l'état incluant le module et un code de test.
Flèches du clavier pour déplacer le carré
Escape pour quitter.

Ce module permet aussi de tester des combinaisons de touches
Control + R pour un carré rouge
Control + G pour un carré vert
Control + B pour un carré bleu

Code : Tout sélectionner

;-// Module keyboard.mod.pbi
; keyboard.mod.pbi - Version 1.0

DeclareModule keyboard 
  Declare InitKey(mode = #PB_Ignore)
  Declare KeyPress(value, released.b = #False)
EndDeclareModule

Module keyboard
  Structure NewKey
   mode.i       ; Topologie clavier
   current.i    ; Touche à tester
   released.b   ; Touche relachée oui ou non  
   previous.i   ; Touche precédement pressée 
  EndStructure
  Global key.NewKey 
    
  ; Initialisation topologie du clavier 
  Procedure InitKey(mode = #PB_Ignore)  
    If mode = #PB_Keyboard_International 
      key\mode = $0409
    ElseIf mode = #PB_Keyboard_Qwerty
      key\mode = $040C
    Else
      If mode <> #PB_Ignore 
        key\mode = mode
      Else
        key\mode = GetKeyboardLayout_(0)
      EndIf
    EndIf  
    ProcedureReturn key\mode
  EndProcedure
  
  ; Est ce que la touche testée est préssée ou relachée (released.b = #True) 
  Procedure KeyPress(value, released.b = #False)
    
    ; Mystere les touche de déplacement ne sont pas reconnues par MapVirtualKeyEx
    ; Mais peut être que je ne sais pas faire ^^
    Select value  
      Case #PB_Key_Left   : value = 37
      Case #PB_Key_Right  : value = 39
      Case #PB_Key_Up     : value = 38
      Case #PB_Key_Down   : value = 40           
      Default             : value = MapVirtualKeyEx_(value, #MAPVK_VSC_TO_VK, KeyboardMode)
    EndSelect
    
    Key\released = released
     
    If GetAsyncKeyState_(value)
      If released = #False 
        ; la touche peut être repéter
        key\previous = #PB_Ignore
        key\current  = value
      Else
        ; La touche doit être relacher 
        key\previous = value
        key\current  = #False ; On ne retournera pas la touche relachée
      EndIf 
    Else
      ; La touche en cours de test est relachée
      ; ? Le test consisté à tester une touche relachée
      ; ? Est ce que la touche précédement pressée et la meme que celle qui est relachée
      If Key\released  And value = key\previous
        Key\released = #False
        key\current = value
      Else
        key\current = #False
      EndIf
    EndIf
    
    ProcedureReturn key\current
  EndProcedure
EndModule

;-
;-// Zone de test
EnableExplicit

UseModule keyboard

; Fenetre application, viewport et couleur arriere plan 
Global window, ww = 800, wh = 600, viewport, wColor.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 GameRender()

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_NoDepthBuffer | #PB_OpenGL_Keyboard)
  SetActiveGadget(viewport)
  
  ; Modifier le contexte courant
  SetGadgetAttribute(viewport, #PB_OpenGL_SetContext, #True)
  
  ; Couleur d'arrirer plan
  glClearColor_(Red(wColor)/255, Green(wColor)/255, Blue(wColor)/255, 1.0)
  
  ; Volume de visualisation 
  glMatrixMode_(#GL_PROJECTION)
  glLoadIdentity_();
  gluOrtho2D_(0, ww, wh, 0)
  
  ;Rendu 2D
  InitKey()
  GameRender()
EndProcedure

Procedure GameRender()
  Protected Speed.f = 8
  
  Repeat 
    
    If KeyPress(#PB_Key_Left)
      sx - speed
    EndIf
    
    If KeyPress(#PB_Key_Right)
      sx + speed
    EndIf
    
    If KeyPress(#PB_Key_Up)
      sy - speed
    EndIf
    
    If KeyPress(#PB_Key_Down)
      sy + Speed
    EndIf
    
    If KeyPress(#PB_Key_LeftControl) And KeyPress(#PB_Key_R)
      scolor = RGB(255, 0, 0)
    EndIf
    
    If KeyPress(#PB_Key_LeftControl) And KeyPress(#PB_Key_G)
      scolor = RGB(0, 255, 0)
    EndIf
    
    If KeyPress(#PB_Key_LeftControl) And KeyPress(#PB_Key_B)
      scolor = RGB(0, 0, 255)
    EndIf
    
    
    ; 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)
    
  Until WindowEvent() = #PB_Event_CloseWindow Or KeyPress(#PB_Key_Escape, #True)
EndProcedure
J'aimerais pouvoir rendre ce code compatible OSx. Merci
Configuration : Windows 11 Famille 64-bit - PB 6.03 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
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Gadget OpenGL : Utilisation du clavier

Message par Ar-S »

Très très fluide sur pc en tout cas. Nikel.
~~~~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
crisot
Messages : 98
Inscription : lun. 30/août/2004 21:03

Re: Gadget OpenGL : Utilisation du clavier

Message par crisot »

falsam a écrit :@crisot : Merci pour cette solution. Je pense que le mieux serait de dissocier la bibliothèque keyboard de la bibliothèque screen ;)
Les input event et les écrans/fenêtre sont étroitement liés, c'est les Os qui veulent ça. Donc difficile de faire autrement. Techniquement, il n'y a pas tellement d'autre solution que ce que je t'ai proposé, hormis le coder différemment, il faudra toujours récupérer à la mimine les KeyDown et le KeyUp. C'est très probablement ce que fait ExamineKeyboard() pour offrir le résultat sous une forme un peu plus simple (basic...).

Honnêtement, et même si moi même j'étais parti dans le délire d'utiliser OpenGL en PB il y a quelques années, je pense que c'est une erreur. PB à un moteur 3D intégré, performant, et utilisable en restant dans les notions d'utilisation d'un basic. Autant s'en tenir à ça, ça fonctionne très bien. Si c'est pour commencer à aller taper OpenGL directement et souffrir de la complexification qui va avec, autant passer à un langage plus bas niveau. A mon humble avis.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Gadget OpenGL : Utilisation du clavier

Message par falsam »

Ar-S a écrit :Honnêtement, et même si moi même j'étais parti dans le délire d'utiliser OpenGL en PB il y a quelques années, je pense que c'est une erreur. PB à un moteur 3D intégré, performant, et utilisable en restant dans les notions d'utilisation d'un basic. Autant s'en tenir à ça
Je te rassure, je ne compte pas coder un moteur 3D. Par contre je m'amuse avec la création d'un moteur 2D ;)
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre