[RESOLU] fenetre3D et windowEvents()

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
ymerdy
Messages : 19
Inscription : jeu. 19/oct./2017 22:10

[RESOLU] fenetre3D et windowEvents()

Message par ymerdy »

Bonjour,
comment gérer correctement les evenements d'une fenetre3D et ceux d'une fenetre dans la meme boucle?
Dans l'exemple suivant, j'ouvre une 1ere fenetre qui contient un trackbar, et un string qui affiche la valeur du trackbar.
(NB: les evenements de cette fenetre ne sont pas gérés pour simplifier l'exemple)

J'ouvre ensuite une 2eme fenetre avec un trackbar qui agit sur la meme valeur.
En cas d'evenement dans cette 2eme fenetre, les 2 gadgets de la 1ere fenetre sont mis a jour.

J'ouvre ensuite une 3eme fenetre, avec un windowedscreen et une fenetre3D.
Déjà, on voit que les gadgets des 2 1eres fenetres ne s'affichent pas tant qu'il n'y a pas une action dans la 3eme fenetre.
Dans cette fenetre3D, le clic souris agit egalement sur la meme valeur, et les evenements doivent mettre a jour les autres gadgets pour que l'état soit cohérent entre les 3 fenetres.

Problème: les trackbar sont bien mis a jour, mais le string ne se rafraichit pas.
???

Si la fenetre3D lache le focus (touche TAB), le string se rafraichit.

Code : Tout sélectionner

Global Window_0, Window_1

Global TrackBar_0, String_0
Global TrackBar_1
Global TrackBar_2

If InitEngine3D()=0
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
  End
EndIf

Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/GUI", #PB_3DArchive_FileSystem)
  
InitSprite()
InitKeyboard()
InitMouse()

Procedure OpenWindow_0(x = 0, y = 0, width = 350, height = 220)
  Window_0 = OpenWindow(#PB_Any, x, y, width, height, "", #PB_Window_SystemMenu)
  TrackBar_0 = TrackBarGadget(#PB_Any, 30, 30, 280, 40, 0, 100)
  String_0 = StringGadget(#PB_Any, 70, 110, 180, 30, "")
EndProcedure

Procedure OpenWindow_1(x = 400, y = 0, width = 350, height = 220)
  Window_1 = OpenWindow(#PB_Any, x, y, width, height, "", #PB_Window_SystemMenu)
  TrackBar_1 = TrackBarGadget(#PB_Any, 30, 30, 280, 40, 0, 100)
EndProcedure

Procedure OpenWindow_2(x = 800, y = 0, width = 350, height = 220)
  Window_2 = OpenWindow(#PB_Any, x, y, width, height, "", #PB_Window_SystemMenu)
  OpenWindowedScreen(WindowID(Window_2), 0, 0, width, height, 0, 0, 0)
  CreateCamera(0, 0, 0, 100, 100)  ; Front camera
  MoveCamera(0,0,100,100, #PB_Absolute)
  WindowGUI=OpenWindow3D(#PB_Any, 10, 10, 340, 200, "trackbar")
  
  ShowGUI(0, 1) ;Hide the GUI, display the mouse cursor
EndProcedure

Procedure Window_1_Events(event)
      tbval.i = GetGadgetState(TrackBar_1)
      SetGadgetState(TrackBar_0,tbval)
      SetGadgetText(String_0,StrU(tbval))
EndProcedure

OpenWindow_0()
OpenWindow_1()
OpenWindow_2()

Repeat
  ; capture events
  
  Event = WindowEvent()  
  EventWindow = EventWindow()
  
  ; manage events
  
  If EventWindow = Window_1
    Window_1_Events(Event)
  EndIf
  
  
  If ExamineMouse()
    InputEvent3D(MouseX(), MouseY(), MouseButton(#PB_MouseButton_Left))
  EndIf
  
  
  If MouseButton(#PB_MouseButton_Left) 
    shininess=(GetGadgetState(TrackBar_1)+1)%80
    SetGadgetText(String_0,StrU(shininess))
    SetGadgetState(TrackBar_0,shininess)
    SetGadgetState(TrackBar_1,shininess)
  EndIf
  
  If ExamineKeyboard()
    If KeyboardPushed(#PB_Key_Tab)
      SetActiveWindow(Window_1)
    EndIf
  EndIf
  
  RenderWorld() 
  FlipBuffers()
Until Event = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)

Testé en PB5.71 X64
Dernière modification par ymerdy le mar. 01/oct./2019 16:45, modifié 2 fois.
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: screen3Devents() et windowEvents()

Message par falsam »

Traiter la file d'attente des événements Windows en priorité ;)

Code : Tout sélectionner

Repeat
  ; capture events
  
  ;Traiter la file d'attente des événements windows
  Repeat 
   Event = WindowEvent()  
   EventWindow = EventWindow()
  Until Event = 0
    
  ; manage events
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%
ymerdy
Messages : 19
Inscription : jeu. 19/oct./2017 22:10

Re: fenetre3D et windowEvents()

Message par ymerdy »

Merci Falsam,

mais avec cette solution, Event vaut toujours 0 en sortie de boucle.

Donc je ne peux plus traiter les evenements qui se produisent dans mes fenetres 1 et 2 ?

Par exemple, il n'est plus possible de quitter l'appli avec les boutons de fermeture de fenetre des fenetres 1 et 2.

C'est le problème que j'ai en utilisant screen3DEvents() de la plupart des exemples 3D, qui comporte cette boucle que tu indiques...
ymerdy
Messages : 19
Inscription : jeu. 19/oct./2017 22:10

Re: fenetre3D et windowEvents()

Message par ymerdy »

Oups, je pense que j'ai mal compris...

Je suppose qu'il faut separer les 2 avec:
;capture events
...
;manage events
...

puis
;capture 3Devents
...
;manage3Devents
...

OK, je teste

MERCI!
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: fenetre3D et windowEvents()

Message par falsam »

ymerdy a écrit :mais avec cette solution, Event vaut toujours 0 en sortie de boucle.
Normal car tu as fini de traiter les évènements liés aux fenêtres.

Il faut traiter les évènements fenêtres gadgets, etc …. à l'intérieur de cette boucle.
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%
ymerdy
Messages : 19
Inscription : jeu. 19/oct./2017 22:10

Re: fenetre3D et windowEvents()

Message par ymerdy »

OK,

J'ai splitté la gestion des evenements en 2 parties, je n'ai plus de problème d'affichage des gadgets, mais quand j'appuie sur TAB pour redonner le focus à ma 1ere fenetre, je ne recupère pas le pointeur souris!???

Est-ce qu'on est obligé de passer par les windows3D pour capturer le pointeur souris dans la fenetre où on fait des affichages 3D?

D'ailleurs y a-t-il un moyen plus simple pour que la fenetre d'affichage 3D cesse de capturer le pointeur?
J'ai pensé à gérer une touche qui donne le focus a une autre fenetre, mais ça me semble vraiment moche, et je ne sais pas comment je ferais si j'avais uniquement la fenetre d'affichage 3D.

Code : Tout sélectionner

Global Window_0, Window_1

Global TrackBar_0, String_0
Global TrackBar_1
Global TrackBar_2

If InitEngine3D()=0
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
  End
EndIf

Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/GUI", #PB_3DArchive_FileSystem)
  
InitSprite()
InitKeyboard()
InitMouse()

Procedure OpenWindow_0(x = 0, y = 0, width = 350, height = 220)
  Window_0 = OpenWindow(#PB_Any, x, y, width, height, "", #PB_Window_SystemMenu)
  TrackBar_0 = TrackBarGadget(#PB_Any, 30, 30, 280, 40, 0, 100)
  String_0 = StringGadget(#PB_Any, 70, 110, 180, 30, "")
EndProcedure

Procedure OpenWindow_1(x = 400, y = 0, width = 350, height = 220)
  Window_1 = OpenWindow(#PB_Any, x, y, width, height, "", #PB_Window_SystemMenu)
  TrackBar_1 = TrackBarGadget(#PB_Any, 30, 30, 280, 40, 0, 100)
EndProcedure

Procedure OpenWindow_2(x = 800, y = 0, width = 350, height = 220)
  Window_2 = OpenWindow(#PB_Any, x, y, width, height, "", #PB_Window_SystemMenu)
  OpenWindowedScreen(WindowID(Window_2), 0, 0, width, height, 0, 0, 0)
  CreateCamera(0, 0, 0, 100, 100)  ; Front camera
  MoveCamera(0,0,100,100, #PB_Absolute)
  WindowGUI=OpenWindow3D(#PB_Any, 10, 10, 340, 200, "trackbar")
  
  ShowGUI(0, 1) ;Hide the GUI, display the mouse cursor
EndProcedure

Procedure Window_1_Events(event)
      tbval.i = GetGadgetState(TrackBar_1)
      SetGadgetState(TrackBar_0,tbval)
      SetGadgetText(String_0,StrU(tbval))
EndProcedure

OpenWindow_0()
OpenWindow_1()
OpenWindow_2()

Repeat
  ;Traiter la file d'attente des événements windows
  Repeat
    ; capture events
    Event = WindowEvent()  
    EventWindow = EventWindow()
    
    ; manage events
    
    If EventWindow = Window_1
      Window_1_Events(Event)
    EndIf
    
  Until Event = 0
  
  
  ;Traiter la file d'attente des événements windows3D
  Repeat
    Event = WindowEvent3D()
    
    If ExamineMouse()
      InputEvent3D(MouseX(), MouseY(), MouseButton(#PB_MouseButton_Left))
    EndIf
    
    If MouseButton(#PB_MouseButton_Left) 
      shininess=(GetGadgetState(TrackBar_1)+1)%80
      SetGadgetText(String_0,StrU(shininess))
      SetGadgetState(TrackBar_0,shininess)
      SetGadgetState(TrackBar_1,shininess)
    EndIf
    
    If ExamineKeyboard()
      If KeyboardPushed(#PB_Key_Tab)
        SetActiveWindow(Window_1)
      EndIf
    EndIf
  Until Event = 0
  
  RenderWorld() 
  FlipBuffers()
Until Event = #PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)
ymerdy
Messages : 19
Inscription : jeu. 19/oct./2017 22:10

Re: fenetre3D et windowEvents()

Message par ymerdy »

Hello,

bon, finalement c'est pas mal de lire la doc.
ReleaseMouse() et l'exemple fourni répondent à mes questions.

En tout cas merci pour l'éclaircissement.
Avatar de l’utilisateur
Mindphazer
Messages : 694
Inscription : mer. 24/août/2005 10:42

Re: fenetre3D et windowEvents()

Message par Mindphazer »

ymerdy a écrit :bon, finalement c'est pas mal de lire la doc.
Et oui.... RTFM comme ils disent... :mrgreen:
Bureau : Win10 64bits
Maison : Macbook Pro M3 16" SSD 512 Go / Ram 24 Go - iPad Pro 32 Go (pour madame) - iPhone 15 Pro Max 256 Go
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: fenetre3D et windowEvents()

Message par microdevweb »

Ho yes ,read this fucking manual :mrgreen:
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Répondre