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