Screen et mouse

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Screen et mouse

Message par blendman »

salut

Microdevweb avait posé une question sur les screen et les souris, et je m'étais déjà bien pris la tête avec ça, donc voici un petit code qui permet de gérer le screen et les souris assez facilement ;)

Avec MouseX() et MouseY() :

Code : Tout sélectionner

InitSprite()
InitMouse()
InitKeyboard()

screenwidth = 1024
screenheight = 768
ScreenX = 50
ScreenY = 50
If OpenWindow(0, 0, 0, screenwidth, screenheight, "Antialiased Line Demo", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) : EndIf

If OpenWindowedScreen(WindowID(0),ScreenX,ScreenY,screenwidth-100, screenheight-100)=0
  MessageRequester("Error", "Can't Open Screen!", 0)
  End
EndIf

ShowCursor_(1)

Repeat
 
  mx = WindowMouseX(0) - ScreenX
  my = WindowMouseY(0) - ScreenY
  ; d'abord je vérifie les event gadgets, menus, mouse, etc..
 
  Repeat
    ; il faut ça pour vérifier les events, afin de ne pas bloquer la fenêtre
    Event       = WaitWindowEvent(1)
    EventMenu   = EventMenu()
    EventGadget = EventGadget()
    EventType   = EventType()
    EventWindow = EventWindow()
   
    If Event >0
     
      Select Event
         
        Case #PB_Event_Menu ; les events menus à tester
         
        Case #PB_Event_Gadget ; les event gadgets à tester
         
        Case #WM_LBUTTONDOWN
          MouseClic = 1
         
        Case #WM_LBUTTONUP
          MouseClic = 0
         
        Case #PB_Event_CloseWindow
          quit = 1
         
      EndSelect
     
    EndIf
   
  Until Event = 0 Or event = #WM_LBUTTONDOWN Or Event = #WM_LBUTTONUP
 
  ; puis je vérifie ce que je fais sur le screen
  If Mx>0 And My>0 And Mx<ScreenWidth()-1 And My<ScreenHeight()-1
    
    If Inscreen = 0
      Inscreen = 1
      ReleaseMouse(0)
      MouseLocate(mx-canvasX, My-canvasY)
    EndIf
   
    If MouseClic ; on a cliqué, on peut faire des actions sur le screen.
      
      ReleaseMouse(0)
      Inscreen = 1
      
      MouseLocate(mx-canvasX, My-canvasY)
      ExamineMouse()
      x = MouseX()
      y = MouseY()
      Debug Str(x)+"/"+Str(y)
     
      ;Debug "on clique sur le screen"     
      ClearScreen(0)           
      ; ici, on display les sprites par exemple       
      FlipBuffers()
     
    Else ; ou d'autres actions ne nécessitant pas de rester cliqué
         ; si besoin, on release la souris
      ReleaseMouse(1)
      ;Debug "on est sur le screen, mais on ne clique pas dessus"
      ClearScreen(0)           
      ; ici, on display les sprites par exemple     
      FlipBuffers()
     
    EndIf
   
  Else
    ;Debug "on n'est plus sur le screen, mais l'interface, gadget, etc..)"
    If inscreen = 1
      Inscreen = 0
      ReleaseMouse(1)
    EndIf
   
  EndIf
 
  ; SI besoin, on vérifie les event keyboard
  If ExamineKeyboard()
   
  EndIf
 
Until quit = 1

Et sans (pour des applications graphiques par exemple) :

Code : Tout sélectionner

InitSprite()
InitKeyboard()

screenwidth = 1024
screenheight = 768
ScreenX = 50
ScreenY = 50
If OpenWindow(0, 0, 0, screenwidth, screenheight, "Antialiased Line Demo", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) : EndIf

If OpenWindowedScreen(WindowID(0),ScreenX,ScreenY,screenwidth-100, screenheight-100)=0
  MessageRequester("Error", "Can't Open Screen!", 0)
  End
EndIf

Repeat
  
  mx = WindowMouseX(0) - ScreenX
  my = WindowMouseY(0) - ScreenY
  ; d'abord je vérifie les event gadgets, menus, mouse, etc..
  
  Repeat
    ; il faut ça pour vérifier les events, afin de ne pas bloquer la fenêtre
    Event       = WaitWindowEvent(1)
    EventMenu   = EventMenu()
    EventGadget = EventGadget()
    EventType   = EventType()
    EventWindow = EventWindow()
    
    If Event >0
      
      Select Event
          
        Case #PB_Event_Menu ; les events menus à tester
          
        Case #PB_Event_Gadget ; les event gadgets à tester
          
        Case #WM_LBUTTONDOWN
          MouseClic = 1
          
        Case #WM_LBUTTONUP
          MouseClic = 0
          
        Case #PB_Event_CloseWindow
          quit = 1
          
      EndSelect
      
    EndIf
    
  Until Event = 0 Or event = #WM_LBUTTONDOWN Or Event = #WM_LBUTTONUP
  
  ; puis je vérifie ce que je fais sur le screen
  If Mx>0 And My>0 And Mx<ScreenWidth()-1 And My<ScreenHeight()-1
    
    If MouseClic ; on a cliqué, on peut faire des actions sur le screen.
     
      ;Debug "on clique sur le screen"     
      ClearScreen(0)           
      ; ici, on display les sprites par exemple       
      FlipBuffers()
      
    Else ; ou d'autres actions ne nécessitant pas de rester cliqué
       
      ;Debug "on est sur le screen, mais on ne clique pas dessus"
      ClearScreen(0)           
      ; ici, on display les sprites par exemple     
      FlipBuffers()
      
    EndIf
    
  Else
    ;Debug "on n'est plus sur le screen, mais l'interface, gadget, etc..)"
        
  EndIf
  
  ; SI besoin, on vérifie les event keyboard
  If ExamineKeyboard()
    
  EndIf
  
Until quit = 1
Dernière modification par blendman le mar. 23/juin/2015 8:04, modifié 1 fois.
Avatar de l’utilisateur
microdevweb
Messages : 1800
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Screen et mouse

Message par microdevweb »

merci blendman pour ces infos, je me tâte toujours entre utilisé un Canvas ou un screen, mais le canvas bouffe beaucoup de cpu donc, je vais je penses modifié pour repassé avec un screen.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Screen et mouse

Message par falsam »

Merci pour ce partage Blendman. Mais !! (héhé). Le premier clique sue le screen fonctionne mais pas les suivants car le cursor de la souris se déplace dans une autre position du screen.
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
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Screen et mouse

Message par blendman »

falsam a écrit : Le premier clique sue le screen fonctionne mais pas les suivants car le cursor de la souris se déplace dans une autre position du screen.
J'ai corrigé le premier message (1er code), ça devrait être ok ;)
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Screen et mouse

Message par falsam »

Merci Blendman c'est génial.
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%
pat
Messages : 406
Inscription : mar. 24/nov./2009 15:13

Re: Screen et mouse

Message par pat »

Pour ma part je n'utilise pas MouseX() et MouseY().
Cela a pour effet d'enfermer la souris dans la fenêtre (voir le jeu casse-briques de Spock) et de rendre visible la souris.
J'utilise les APIs pour remédier à ces inconvénients.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Screen et mouse

Message par falsam »

pat a écrit :Pour ma part je n'utilise pas MouseX() et MouseY()......
Il y a une solution simple comme celle que je préconise sur ce lien quand le screen est égale à la taille de la fenêtre.
:arrow: http://www.purebasic.fr/french/viewtopi ... 81#p162881
pat a écrit :J'utilise les APIs pour remédier à ces inconvénients.
Ha le plaisir de partager ses connaissances .....
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
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Screen et mouse

Message par blendman »

pat a écrit :Pour ma part je n'utilise pas MouseX() et MouseY().
Cela a pour effet d'enfermer la souris dans la fenêtre (voir le jeu casse-briques de Spock) et de rendre visible la souris.
J'utilise les APIs pour remédier à ces inconvénients.
Tu devrais tester mon code avec mouseX() et MouseY(), la souris n'y est pas enfermée du tout ;).

Moi, je n'utilise pas mouseX() et MouseY(), car ça crée des problèmes dans mon application 2D, mais pour d'autres applications ou jeux, ça m'est arrivé.
Et la souris n'était pas bloquée dans la fenêtre.
Répondre