PureBasic

Forums PureBasic
Nous sommes le Mer 19/Juin/2019 12:46

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 19 messages ]  Aller à la page Précédente  1, 2
Auteur Message
 Sujet du message: Re: Gadget OpenGL : Utilisation du clavier
MessagePosté: Ven 19/Avr/2019 21:08 
En ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6856
Localisation: IDF (Yvelines)
@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:
;-// 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

_________________

➽ Config PureBasic : i3, RAM 4Go, NVidia (1024 Mo), Windows 10 - PB 5.70 LTS
➽ Je papote aussi sur http://purebasic.chat & http://purebasic.chat/forum

➽ Sites personnels http://falsam.com & EasySprite.js

➽ Je ne réponds pas aux MP techniques


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Gadget OpenGL : Utilisation du clavier
MessagePosté: Ven 19/Avr/2019 21:50 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 09/Oct/2005 16:51
Messages: 8670
Très très fluide sur pc en tout cas. Nikel.

_________________
~~~~Règles du forum ~~~~
.: Ar-S :. Tour + portable W10 x64 PB 5.4x / 5.6x
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
RESIZER GOLD : Mon logiciel de redimensionnement par lot 100% PB


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Gadget OpenGL : Utilisation du clavier
MessagePosté: Ven 19/Avr/2019 22:45 
Hors ligne

Inscription: Lun 30/Aoû/2004 21:03
Messages: 88
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.

_________________
http://crisot.com/odyssey
http://crisot.com/dev


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Gadget OpenGL : Utilisation du clavier
MessagePosté: Ven 19/Avr/2019 22:49 
En ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6856
Localisation: IDF (Yvelines)
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 ;)

_________________

➽ Config PureBasic : i3, RAM 4Go, NVidia (1024 Mo), Windows 10 - PB 5.70 LTS
➽ Je papote aussi sur http://purebasic.chat & http://purebasic.chat/forum

➽ Sites personnels http://falsam.com & EasySprite.js

➽ Je ne réponds pas aux MP techniques


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 19 messages ]  Aller à la page Précédente  1, 2

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 2 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  
cron

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye