Page 1 sur 1

Screen et mouse

Publié : dim. 21/juin/2015 14:30
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

Re: Screen et mouse

Publié : dim. 21/juin/2015 15:57
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.

Re: Screen et mouse

Publié : lun. 22/juin/2015 13:23
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.

Re: Screen et mouse

Publié : mar. 23/juin/2015 8:12
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 ;)

Re: Screen et mouse

Publié : mar. 23/juin/2015 9:08
par falsam
Merci Blendman c'est génial.

Re: Screen et mouse

Publié : sam. 04/juil./2015 10:49
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.

Re: Screen et mouse

Publié : sam. 04/juil./2015 11:02
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 .....

Re: Screen et mouse

Publié : sam. 04/juil./2015 12:11
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.