[RESOLU] GagetOpenGL et position de la souris.

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

[RESOLU] GagetOpenGL et position de la souris.

Message par falsam »

Bonjour,

J'utilise l'OpenGLGadget() et avec le code ci-dessous, je souhaite que le sprite matérialisé par un carré jaune suit le déplacement de la souris.

Hors ce n'est pas le cas (Presque pas le cas 🙃)

Les coordonnées de la souris alterne entre la position réel et le point de coordonnée 0,0 correspondant au sommet gauche du gadget OpenGL ce qui a pour résultat un rendu chaotique.

■ Le code.

Code : Tout sélectionner

EnableExplicit

; 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, sy, sw = 64, sh = 64, sColor = RGB(255, 215, 0)

;Plan de l'application
Declare Start()

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
    GameRender()
  Until WindowEvent() = #PB_Event_CloseWindow  
EndProcedure


; Rendu de la scene OpenGl
Procedure GameRender()
  
  sx = GetGadgetAttribute(Viewport, #PB_OpenGL_MouseX)
  sy = GetGadgetAttribute(Viewport, #PB_OpenGL_MouseY)
  
  Debug "Position x/y " + Str(sx) + "/" + Str(sy)  
  
  ; 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
■ Un extrait du débug
...
Position x/y 767/56
Position x/y 0/0
Position x/y 767/39
Position x/y 0/0
Position x/y 767/11
Position x/y 0/0
Position x/y 768/3
Position x/y 0/0
...
D'avance merci pour votre aide.
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
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Re: GagetOpenGL et position de la souris.

Message par SPH »

Début de piste encourageant :

Code : Tout sélectionner

EnableExplicit

; 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, sy, sw = 64, sh = 64, sColor = RGB(255, 215, 0)
Global sx2, sy2

;Plan de l'application
Declare Start()

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
    GameRender()
  Until WindowEvent() = #PB_Event_CloseWindow  
EndProcedure


; Rendu de la scene OpenGl
Procedure GameRender()
  
  sx = GetGadgetAttribute(Viewport, #PB_OpenGL_MouseX)
  sy = GetGadgetAttribute(Viewport, #PB_OpenGL_MouseY)
  
  ;-;;;;;;; SPH correction
  If sx<>0 And sy<>0
    ;Debug "Position x/y " + Str(sx) + "/" + Str(sy)  
    If sx>sx2
      sx2+4
    Else
      sx2-4
    EndIf
    If sy>sy2
      sy2+4
    Else
      sy2-4
    EndIf
  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_(sx2, sy2)             ;Point haut gauche
  glVertex2i_(sx2 + sw, sy2)        ;Point haut droit
  glVertex2i_(sx2 + sw, sy2 + sh)   ;Point bas droit
  glVertex2i_(sx2, sy2 + sh)        ;Point bas gauche
  glEnd_()                          ;Fin du polygone
  
  glPopMatrix_();
  
  ; Flip buffer
  SetGadgetAttribute(Viewport, #PB_OpenGL_FlipBuffers, #True)  
EndProcedure

Procedure Exit()  
  End
EndProcedure

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: GagetOpenGL et position de la souris.

Message par falsam »

Non c'est pas encourageant. Le sprite ne suit pas la souris et c'est du bricolage ta solution. Je vais t'insulter sur Discord. ha ha ha. Merci SPH 🤪😉

PS : Je précise que je m'entend très bien avec SPH depuis des années.
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
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Re: GagetOpenGL et position de la souris.

Message par SPH »

Chez ouam, le sprite suit la souris. Par contre, tu ne précises pas si tu veux qu'il n'y ai pas de "pause" dans le mouvement du sprite.

Chez moi, je finis (et je commence) par du bricolage. :lol:
==
Enfin... j'aurais essayé :wink:

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: GagetOpenGL et position de la souris.

Message par falsam »

SPH a écrit : sam. 26/avr./2025 16:07 Par contre, tu ne précises pas si tu veux qu'il n'y ai pas de "pause" dans le mouvement du sprite.
Je ne précise pas effectivement. Mais dans mon message je dis "je souhaite que le sprite matérialisé par un carré jaune suit le déplacement de la souris." C'est un code minimaliste pour faire ressortir uniquement le souci que je rencontre. Je n'ai pas besoin de faire une pause sauf celle de la pause café.
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
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: GagetOpenGL et position de la souris.

Message par falsam »

A prioris je dois coder comme un gros noob !

Dans la procédure GameRender(), j'ai du tester si il y avait un évènement gadget avant de tester la position de la souris.

Code : Tout sélectionner

  If WindowEvent() = #PB_Event_Gadget
    sx = GetGadgetAttribute(Viewport, #PB_OpenGL_MouseX)
    sy = GetGadgetAttribute(Viewport, #PB_OpenGL_MouseY)
    
    Debug "Position x/y " + Str(sx) + "/" + Str(sy)  
  EndIf
Voila le code corrigé

Code : Tout sélectionner

EnableExplicit

; 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, sy, sw = 64, sh = 64, sColor = RGB(255, 215, 0)

;Plan de l'application
Declare Start()

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
    GameRender()
  Until WindowEvent() = #PB_Event_CloseWindow  
EndProcedure


; Rendu de la scene OpenGl
Procedure GameRender()
  If WindowEvent() = #PB_Event_Gadget
    sx = GetGadgetAttribute(Viewport, #PB_OpenGL_MouseX)
    sy = GetGadgetAttribute(Viewport, #PB_OpenGL_MouseY)
    
    Debug "Position x/y " + Str(sx) + "/" + Str(sy)  
  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)  
EndProcedure

Procedure Exit()  
  End
EndProcedure
Je laisse le sujet ouvert au cas ou il y aurait une autre solution ....
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%
nemerod
Messages : 40
Inscription : mer. 24/août/2022 0:58

Re: GagetOpenGL et position de la souris.

Message par nemerod »

falsam a écrit : sam. 26/avr./2025 11:49 Bonjour,

J'utilise l'OpenGLGadget() et avec le code ci-dessous, je souhaite que le sprite matérialisé par un carré jaune suit le déplacement de la souris.

Hors ce n'est pas le cas (Presque pas le cas 🙃)

Les coordonnées de la souris alterne entre la position réel et le point de coordonnée 0,0 correspondant au sommet gauche du gadget OpenGL ce qui a pour résultat un rendu chaotique.
......
BON
je confirme SPH a prise tres tres mal (je rigole falsam a etais plutot correct sur discord)


mais voila 2 code coup sur coup, donc la premier qui est un peu moche mais si tu clip la souri dans le screen c'est pas un probleme, voir l'autre section de code que je tes fais sur discord

premier code

Code : Tout sélectionner

DisableExplicit

; Fenetre principale ET PAS Viewport et couleur arriere plan 
Global Window, ww = 800, wh = 600

; Viewport (OpenGLgadget)
Global Viewport, vColor.f = RGB(107, 142, 35)

; Sprite  simple carré jaune a -8% de vert
Global sx, sy, sw = 64, sh = 64, sColor = RGB(255, 215, 0)

;Plan de l'application
Declare GameRender();never put event windows in loop render, on va évité les plantage programme et pour que les OS sois heureux, éviton les leak
;Declare Start() MAIN THREAD WITH VARIABLE can have problem
;Declare Exit() USELESS
;Start() USELESS specialty for main loop with event

;Procedure Start() USELESS
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_FlipSynchronization);VSYNC ENABLE !!!! bye keyboard input

; 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()) DEPRECATED FUNCTION BindEvent

;Loop
Repeat:eee=WindowEvent()
  Select eee
    Case $000;no event, fais ton rendu ici le falsam
      sx=WindowMouseX(Window);retourne -1 si souri a l'excterieur 
      sy=WindowMouseY(Window);je conseil pas cela, voir l'autre code
      GameRender()
      ;Case #autre_event_si_besoin
    Case #PB_Event_ActivateWindow
      ;voir message discord
    Case #PB_Event_DeactivateWindow
      ;voir message discord
    Default
  EndSelect
Until eee=#PB_Event_CloseWindow 
;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)           
  glColor3ubv_(@sColor)
  ;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(); USELESS
;  End
;EndProcedure
N'EST VALIDE a 100% que si tu clip la souri, voir discord pour un exemple de code fonctionnelle

et voila le 2eme code si tu ne clip pas la souri, attention, il demande pas beaucoup mais les appel de purebasic sont lourd et prendre du temps, mais au moins tu a la possibilité pour d'autre element et la position peu être défini si tu change la reference de position que tu peu changé par un ADD, donc surtout si tu veux des valeur relatif ou absolu depuis un autre reference comme un bouton ou depuis une autre fenêtre

Code : Tout sélectionner

DisableExplicit

; Fenetre principale ET PAS Viewport et couleur arriere plan 
Global Window, ww = 800, wh = 600

; Viewport (OpenGLgadget)
Global Viewport, vColor.f = RGB(107, 142, 35)

; Sprite  simple carré jaune a -8% de vert
Global sx, sy, sw = 64, sh = 64, sColor = RGB(255, 215, 0)

;Plan de l'application
Declare GameRender();never put event windows in loop render, on va évité les plantage programme et pour que les OS sois heureux, éviton les leak
;Declare Start() MAIN THREAD WITH VARIABLE can have problem
;Declare Exit() USELESS
;Start() USELESS specialty for main loop with event

;Procedure Start() USELESS
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_FlipSynchronization);VSYNC ENABLE !!!! bye keyboard input

; 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()) DEPRECATED FUNCTION BindEvent

;Loop
Repeat:eee=WindowEvent()
  sx=(DesktopMouseX()-WindowX(Window,#PB_Window_InnerCoordinate))
  sy=(DesktopMouseY()-WindowY(Window,#PB_Window_InnerCoordinate))
  Select eee
    Case $000;no event, fais ton rendu ici le falsam
      GameRender()
      ;Case #autre_event_si_besoin
    Case #PB_Event_ActivateWindow
      ;voir message discord
    Case #PB_Event_DeactivateWindow
      ;voir message discord
    Default
  EndSelect
Until eee=#PB_Event_CloseWindow 
;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)           
  glColor3ubv_(@sColor)
  ;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(); USELESS
;  End
;EndProcedure
et SVP, merci de ne plus mettre la boucle des event dans la boucle de rendu, car les event ne sont pas traitré correctement si vous le faite pas bien et donc cela peu donné une application qui ne réponde pas en message et/ou ne prendre pas en compte vos action se qui est ton cas FALSAM, je te conseille de ne pas placé la boucle des event dans une procedure, purebasic ruine les variable et les utilisation, je te conseille de ne pas faire de procedure pour quitté un programme si elle a le mot End

je sais que les procedure sa permé de structuré un code, mais dans les fais c'est plus un bordel que autre chose avec purebasic
j'ai donc prise la liberté de corrigé cela et de remplacé des petit valeur et fonction par d'autre plus propre

sur se, passe une bonne nuit et que les ligne de code te soit douce

NOTE > le code a etais posté sur discord en premier en réponse a ta demande, aucun test du code n'a etais fais mais je sais qu'il est fonctionnelle et sans erreur
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: GagetOpenGL et position de la souris.

Message par falsam »

nemerod a écrit : sam. 26/avr./2025 21:27 merci de ne plus mettre la boucle des event dans la boucle de rendu, car les event ne sont pas traitré correctement si vous le faite pas bien et donc cela peu donné une application qui ne réponde pas en message et/ou ne prendre pas en compte vos action
Mon cher Nemerod je suis sceptique 🤔 J'aurais aimé avoir le point de vue de Fred.

En tout cas merci d'avoir prêter attention à ma demande.
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%
nemerod
Messages : 40
Inscription : mer. 24/août/2022 0:58

Re: GagetOpenGL et position de la souris.

Message par nemerod »

falsam a écrit : lun. 28/avr./2025 8:36
nemerod a écrit : sam. 26/avr./2025 21:27 merci de ne plus mettre la boucle des event dans la boucle de rendu, car les event ne sont pas traitré correctement si vous le faite pas bien et donc cela peu donné une application qui ne réponde pas en message et/ou ne prendre pas en compte vos action
Mon cher Nemerod je suis sceptique 🤔 J'aurais aimé avoir le point de vue de Fred.

En tout cas merci d'avoir prêter attention à ma demande.
le truc c'est quue c'est noté dans la doc officiel, surtout que tu peu falicement faire un exemple pratique pour simulé se type de cas, donc code aurai juste besoin d'une grosse execution pour ruiné le programme et avoir avec un minimum d'effort un ne réponde pas de windows qui te dit que c'est pas normal
il faus traité les event en priorité, que se sois fred ou une autre personne si les event ne sont pas correctement traitré tu peu avoir un programme instable
Fred
Site Admin
Messages : 2805
Inscription : mer. 21/janv./2004 11:03

Re: GagetOpenGL et position de la souris.

Message par Fred »

Il y a 2 points:
1) Les events doivent tous etre traitrés à chaque frame, sinon ca va ramer (si tu ne traite qu'un seul evenement par frame)
2) Le GetGadgetAtttribute() sur le Canvas/OpenGLGadget() n'est valide que sur un event Canvas/OpenGL

Ca donne ca:

Code : Tout sélectionner

EnableExplicit

; Fenetre principale Viewport et couleur arriere plan 
Global Window, ww = 800, wh = 600, Event, Quit

; Viewport (OpenGLgadget)
Global Viewport, vColor.f = RGB(107, 142, 35)

; Sprite  
Global sx, sy, sw = 64, sh = 64, sColor = RGB(255, 215, 0)

;Plan de l'application
Declare Start()

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
    Repeat
      Event = WindowEvent()
      Select Event 
        Case #PB_Event_CloseWindow  
          Quit = 1
        Case #PB_Event_Gadget
          If EventGadget() = Viewport And EventType() = #PB_EventType_MouseMove
            sx = GetGadgetAttribute(Viewport, #PB_OpenGL_MouseX)
            sy = GetGadgetAttribute(Viewport, #PB_OpenGL_MouseY)
          EndIf
      EndSelect
    Until Event = 0
    
    GameRender()
  Until Quit = 1    
EndProcedure


; Rendu de la scene OpenGl
Procedure GameRender()
  
  Debug "Position x/y " + Str(sx) + "/" + Str(sy)  
  
  ; 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
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: GagetOpenGL et position de la souris.

Message par falsam »

Les fonctionnalités MouseX() et MouseY() existants dans la bibliothéque 2D, des fonctions similaires auraient pu exister pour l'OpenGL.

Je vais coder un ces deux fonctionnalités pour mon projet en me servant du code de Fred.

Merci Fred et nemerod pour vos réponses. Sujet Résolu.
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%
nemerod
Messages : 40
Inscription : mer. 24/août/2022 0:58

Re: GagetOpenGL et position de la souris.

Message par nemerod »

Fred a écrit : mer. 30/avr./2025 13:25 Il y a 2 points:
1) Les events doivent tous etre traitrés à chaque frame, sinon ca va ramer (si tu ne traite qu'un seul evenement par frame)
2) Le GetGadgetAtttribute() sur le Canvas/OpenGLGadget() n'est valide que sur un event Canvas/OpenGL

Ca donne ca:

Code : Tout sélectionner

....t())
  
  ;Loop
  Repeat
    Repeat
      Event = WindowEvent()
      Select Event 
        Case #PB_Event_CloseWindow  
          Quit = 1
        Case #PB_Event_Gadget
          If EventGadget() = Viewport And EventType() = #PB_EventType_MouseMove
            sx = GetGadgetAttribute(Viewport, #PB_OpenGL_MouseX)
            sy = GetGadgetAttribute(Viewport, #PB_OpenGL_MouseY)
          EndIf
      EndSelect
    Until Event = 0
    
    GameRender()
  Until Quit = 1    
EndPro....
re_coucou=1
j'ai déja donné l'info et un code pour correctemenbt faire les event
un code construit et fonctionnelle décliné en 2 variation
falsam a écrit : ven. 02/mai/2025 10:52 Les fonctionnalités MouseX() et MouseY() existants dans la bibliothéque 2D, des fonctions similaires auraient pu exister pour l'OpenGL.

Je vais coder un ces deux fonctionnalités pour mon projet en me servant du code de Fred.

Merci Fred et nemerod pour vos réponses. Sujet Résolu.
alors pour info tu va avoir le meme probleme que SPH ou je sais plus qui avec les fonction MouseX() et MouseY(), elle ne sont pas adapté pour du monde fenetré et elle sont dépassé, j'ai déja passé des section de code en réponse au autre sur le discord pour prouvé ma solution et résoudre les probleme a cause de de justement de MouseX():MouseY()

donc désolé Fred si ton message fais un peu doublon, c'est pas contre toi ;)

voir video qui est posté sur le discord qui est le code de SPH avec le comparatif des fonction MouseX():MouseY() VS comparatif 1 (Discord Message avec video et code) et comparatif 2 (Discord Message avec video et code)

meme flame avec le jeu de H2H utilise pas les mouse, vraiment désolé Fred mais les fonction des lib suivant ne sont pas a jours pour les systeme moderne

Joystick (manque de fonction est ne peu supporté en totalité les fonction des nouveau controlleur de jeu)
Keyboard (totalement dépassé et ne prendre en compte beaucoup de fonction qui aurai etais pratique qui sont dispo dans beaucoup de jeu actuelle)
Mouse (fonction dépassé depuis les année 2005 a 2010)
Sprite (un manque cruel de fonction pour profité sur support des fonction modern, merci a Falsam de se cassé le dos pour refaire un code viable)
Sound (des gros probleme et des leak memoir son toujours present meme dans les dernier version de PB, j'ai reprogrammé depuis rien un moteur audio sans lib externe, je l'appel le DSP, une execution et temps de latence les plus faible possible, ne demande que 130Ko de memoir et peu donné une qualité ultime, actuellement utilisé dans des project donc celui de Flame avec H2H, le tous sans coupure ou ou fuite memoir, peu se faire torturé a mort et peu fonctionné sur un PC avec processeur de 3eme generation a 2GHz en 64bit 4 coeur sous windows avec d'autre programme, tres stable et fiable)
Engine3D et les autre element des fonction 3D ne peuvent profité des fonction materiel au maximum

en faite plus le temps passe plus les systeme et les OS evolu mais purebasic n'arrive pas a suivre
je te propose Fred si tu veux bien, qu'on prendre un moment pour en parlé et dans l'idée de pouvoir aidé a l'amelioration des fonction de purebasic et du support des nouvelle fonction et possibilité materiel, j'aime beaucoup purebasic et je voudrai pouvoir voir purebasic a jours sur beaucoup de chose pour tous le monde, intérêt commun a tous en d'autre mot,
je t'invite a nous rejoindre sur le discord de purebasic français a l'address https://discord.gg/pm4s2VtZ
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: [RESOLU] GagetOpenGL et position de la souris.

Message par Ollivier »

Une discussion sur Discord ça ne veut rien dire.

Je vois le tissu bizarre qui énumère les bibliothèques en attribuant des critiques non constructives pour chacune d'entre elles : c'est carrément délirant !

Pour info, je me suis "ennuyé" quelques jours en fin 2024, et je me suis éclaté avec pureBasic pendant 3 à 4 jours.

Il faut se prêter au jeu : un soupçon de bug, il faut aller soumettre le problème en Coding question.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: [RESOLU] GagetOpenGL et position de la souris.

Message par Ollivier »

Vous avez un exemple ici : j'ai mis plus de temps à saisir mon mot de passe qu'à écrire en anglais !

Et, logiquement, avec des liens, si quelquechose bloque (barrière de la langue), on peut répercuter une question/réponse (= un dialogue) depuis le forum anglais et vice versa.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: [RESOLU] GagetOpenGL et position de la souris.

Message par Ollivier »

Je n'ai pas menti ! Regardez une réponse immédiate ! Dans les cordes, Discord, avec, cerise sur le gâteau, une petite pub... [Edit] Euh non ! Pas d'illustration de la pub, désolé, pas vu le texte bizarre en-dessous ("wants kick")
Dernière modification par Ollivier le dim. 18/mai/2025 23:42, modifié 1 fois.
Répondre