Page 1 sur 1

Mouse pressed

Publié : jeu. 08/oct./2015 10:59
par blendman
salut

J'ai un petit soucis sur ce code. Lorsque je clique sur la souris, je dois cliquer très vite pour ça fonctionne correctement.

Vous auriez une idée de la boulette que j'ai dû faire pour que ce code fonctionne ?

Code : Tout sélectionner

screenwidth = 640 
screenheight = 480

Global PGL_MousePointerPressed, PGL_MousePointer


Procedure GetMousePRessed()
  
  If PGL_MousePointer = 1 And PGL_MousePointerPressed =0
    PGL_MousePointerPressed = 1
    ProcedureReturn 1
  EndIf
  
EndProcedure


InitSprite()

OpenWindow(0, 0, 0, screenwidth, screenheight, "Mouse pressed", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
If OpenWindowedScreen(WindowID(0),0,0,screenwidth, screenheight)=0
  MessageRequester("Error", "Can't Open Screen!", 0)
  End
EndIf

CreateSprite(0,64,64)
If StartDrawing(SpriteOutput(0))
  Box(0,0,64,64,RGB(255,255,25))
  StopDrawing() 
EndIf

y.f = 50

Repeat
  
  PGL_EventWindow = WaitWindowEvent(1)
  If PGL_EventWindow > 0 ; Or PGL_MousePointer = 1
    Select PGL_EventWindow 
        
      Case #WM_RBUTTONUP,#WM_LBUTTONUP
        PGL_MousePointer = 0
        PGL_MousePointerPressed = 0
        
      Case #WM_RBUTTONDOWN,#WM_LBUTTONDOWN
        PGL_MousePointer = 1
    EndSelect
  EndIf
  
  ClearScreen(0)
  ; physic
  If y < screenheight -64
    y + 2
  EndIf
  
  If GetMousePressed() = 1
    Y = y-50
  EndIf
  
  DisplaySprite(0,150,y)
  FlipBuffers()
  
Until PGL_EventWindow = #PB_Event_CloseWindow

Autre question :
vous connaissez un équivalent Mac et linux à #WM_LBUTTONUP, #WM_LBUTTONDOWN, etc... ?

Merci bien les z'amis.

Re: Mouse pressed

Publié : jeu. 08/oct./2015 11:18
par microdevweb
Bonjour Blendman,

Perso j'ai essayé chez moi ton code semblait fonctionné normalement. Mais essaye comme ceci (voire le gros débat sur le double Repeat)

Code : Tout sélectionner

screenwidth = 640
screenheight = 480

Global PGL_MousePointerPressed, PGL_MousePointer


Procedure GetMousePRessed()
      
      If PGL_MousePointer = 1 And PGL_MousePointerPressed =0
            PGL_MousePointerPressed = 1
            ProcedureReturn 1
      EndIf
      
EndProcedure


InitSprite()

OpenWindow(0, 0, 0, screenwidth, screenheight, "Mouse pressed", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
If OpenWindowedScreen(WindowID(0),0,0,screenwidth, screenheight)=0
      MessageRequester("Error", "Can't Open Screen!", 0)
      End
EndIf

CreateSprite(0,64,64)
If StartDrawing(SpriteOutput(0))
      Box(0,0,64,64,RGB(255,255,25))
      StopDrawing()
EndIf

y.f = 50

Repeat
      Repeat
            PGL_EventWindow = WindowEvent()
            Select PGL_EventWindow
                  Case #WM_RBUTTONUP,#WM_LBUTTONUP
                        PGL_MousePointer = 0
                        PGL_MousePointerPressed = 0
                        
                  Case #WM_RBUTTONDOWN,#WM_LBUTTONDOWN
                        PGL_MousePointer = 1
                  Case #PB_Event_CloseWindow
                        End
            EndSelect
      Until PGL_EventWindow=0
      ClearScreen(0)
      ; physic
      If y < screenheight -64
            y + 2
      EndIf
      
      If GetMousePressed() = 1
            Y = y-50
      EndIf
      
      DisplaySprite(0,150,y)
      FlipBuffers()
      
ForEver

Re: Mouse pressed

Publié : jeu. 08/oct./2015 11:37
par blendman
ça ne marche toujours pas avec ton code ;)
En fait, il prend de temps en temps le GetMousePointer(), pas à chaque fois, c'est très subtil, il faut essayer plusieurs fois.

Une technique qui fonctionne c'est avec initmouse(), mais je préférai éviter d'utiliser ça, car on perd le curseur de la souris :

Code : Tout sélectionner


screenwidth = 640 
screenheight = 480

Global PGL_MousePointer


Procedure GetMousePressed()
  
  If PGL_MousePointer = 1 
    PGL_MousePointer = 2
    ProcedureReturn 1
  EndIf
  
EndProcedure


InitSprite()
InitMouse()
InitKeyboard()
OpenWindow(0, 0, 0, screenwidth, screenheight, "Mouse pressed", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
If OpenWindowedScreen(WindowID(0),0,0,screenwidth, screenheight)=0
  MessageRequester("Error", "Can't Open Screen!", 0)
  End
EndIf
ShowCursor_(1)

CreateSprite(0,64,64)
If StartDrawing(SpriteOutput(0))
  Box(0,0,64,64,RGB(255,255,25))
  StopDrawing() 
EndIf

y.f = 50
t.f = 2

Repeat
  
  Repeat
  PGL_EventWindow = WaitWindowEvent(1)
  If PGL_EventWindow > 0 ; Or PGL_MousePointer = 1
    Select PGL_EventWindow 
      Case  #PB_Event_CloseWindow
        End
     ; Case #PB_Event_LeftClick, #PB_Event_RightClick
        ;PGL_MousePointer = 0
        
      ;Case #WM_LBUTTONDOWN, #WM_RBUTTONDOWN
        ;PGL_MousePointer = 1
        
    EndSelect
  EndIf
Until PGL_EventWindow = 0 

  
  ; physic
  ;t+0.1
  If y < screenheight -64
    y + t
  EndIf
  
  ExamineKeyboard()
  If KeyboardPushed(#PB_Key_Escape)
    End
  EndIf
  
  If inscreen = 0
    If WindowMouseX(0)>=2 And WindowMouseX(0) <=ScreenWidth()-2 And WindowMouseY(0)>=2 And WindowMouseY(0)<=ScreenHeight() -2
      inscreen = 1
      ReleaseMouse(0)
      MouseLocate(WindowMouseX(0),WindowMouseY(0))
    EndIf
  EndIf
  
  If ExamineMouse()
    If inscreen = 1
      If MouseX() > ScreenWidth()-1 Or MouseX()<1 Or MouseY()<1 Or MouseY()>ScreenHeight() -1
        ReleaseMouse(1)
        inscreen = 0
      EndIf
    EndIf    
    
    If MouseButton(#PB_MouseButton_Left  ) 
      If PGL_MousePointer = 0
        PGL_MousePointer = 1
        ;If GetMousePressed() = 1
        Y = y-50
        t = 2
      EndIf
    Else
      PGL_MousePointer =0
    EndIf
  EndIf

  DisplaySprite(0,150,y)
  FlipBuffers()
  ClearScreen(0)  
  
ForEver 

Re: Mouse pressed

Publié : jeu. 08/oct./2015 11:53
par microdevweb
Place ton Screen dans un CanvasGadget() tu ne pers pas le curseur et gère cela comme un canvas

Code : Tout sélectionner

screenwidth = 640
screenheight = 480

Global PGL_MousePointerPressed, PGL_MousePointer


Procedure GetMousePRessed()
      
      If PGL_MousePointer = 1 And PGL_MousePointerPressed =0
            PGL_MousePointerPressed = 1
            ProcedureReturn 1
      EndIf
      
EndProcedure
Procedure EventCanvas()
      Select EventType()
            Case #PB_EventType_LeftButtonUp,#PB_EventType_RightButtonUp
                  PGL_MousePointer = 0
                  PGL_MousePointerPressed = 0
            Case #PB_EventType_LeftButtonDown,#PB_EventType_RightButtonDown
                  PGL_MousePointer = 1
      EndSelect
EndProcedure

InitSprite()

OpenWindow(0, 0, 0, screenwidth, screenheight, "Mouse pressed", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CanvasGadget(1,0,0,screenwidth,screenheight,#PB_Canvas_Keyboard)
StartDrawing(CanvasOutput(1))
Box(0,0,GadgetWidth(1),GadgetHeight(1),RGB(0,0,0))
StopDrawing()
If OpenWindowedScreen(GadgetID(1),0,0,screenwidth, screenheight)=0
      MessageRequester("Error", "Can't Open Screen!", 0)
      End
EndIf
BindGadgetEvent(1,@EventCanvas())
CreateSprite(0,64,64)
If StartDrawing(SpriteOutput(0))
      Box(0,0,64,64,RGB(255,255,25))
      StopDrawing()
EndIf

y.f = 50

Repeat
      Repeat
            PGL_EventWindow = WindowEvent()
            Select PGL_EventWindow
                  Case #PB_Event_CloseWindow
                        End
            EndSelect
      Until PGL_EventWindow=0
      ClearScreen(0)
      ; physic
      If y < screenheight -64
            y + 2
      EndIf
      
      If GetMousePressed() = 1
            Y = y-50
      EndIf
      
      DisplaySprite(0,150,y)
      FlipBuffers()
      
ForEver

Re: Mouse pressed

Publié : jeu. 08/oct./2015 11:59
par blendman
Oui, mais on revient au problème du code non-multi-plateforme ;)

Je pense que je vais garder la solution avec initmouse() et je ferai un curseur-maison (un sprite) pour linux et mac ^^.
Car je ne vois pas comment faire autrement.

Re: Mouse pressed

Publié : jeu. 08/oct./2015 12:07
par microdevweb
Je penses que cela doit être possible avec les autres Os comment? ça je ne le sais pas

un début de solution peu-t’être dans ce topic

http://www.purebasic.fr/french/viewtopi ... 6&start=15
G-Rom a écrit :Linux le fait, je l'ai déjà fait ( avec la SFML entre autre et le screen ) , il y a juste une petite manip à faire sous linux ( PB utilise GTK )
je crois de mémoire qu'il faut faire cela :

Code : Tout sélectionner

Procedure XDisplayFromWindowID(*Window.GtkWidget)  
    *gdkwindowobj._GdkWindowObject = *Window\window
    *impl.GdkDrawableImplX11 = *gdkwindowobj\impl
    *screen.GdkScreenX11 = *impl\screen
    ProcedureReturn *screen\xdisplay       
  EndProcedure   
   
C'est donc pas un bug, win32 & gdk fonctionne différemment

Re: Mouse pressed

Publié : jeu. 08/oct./2015 14:29
par blendman
Non, c'est une souris logitech (infra-rouge).

En fait, comme je disais, c'est assez subtil, ça ne prend qu'un clic sur deux (si je clique trop vite).
Pour voir le soucis, il faut cliquer très très vite ^^ (comme dans certains jeux ^^).
Mais en passant par mousebutton()/examinemouse(), ça devient compatible linux/mac, donc c'est une bonne solution.

Re: Mouse pressed

Publié : jeu. 08/oct./2015 18:14
par Mesa
Si on ajoute le doubleclic alors ça a l'air de marcher.

Code : Tout sélectionner

screenwidth = 640
screenheight = 480

Global PGL_MousePointerPressed, PGL_MousePointer


Procedure GetMousePRessed()
  
  If PGL_MousePointer = 1 And PGL_MousePointerPressed =0
    PGL_MousePointerPressed = 1
    ProcedureReturn 1
  EndIf
  
EndProcedure


InitSprite()

OpenWindow(0, 0, 0, screenwidth, screenheight, "Mouse pressed", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
If OpenWindowedScreen(WindowID(0),0,0,screenwidth, screenheight)=0
  MessageRequester("Error", "Can't Open Screen!", 0)
  End
EndIf

CreateSprite(0,64,64)
If StartDrawing(SpriteOutput(0))
  Box(0,0,64,64,RGB(255,255,25))
  StopDrawing()
EndIf

y.f = 50

Repeat
  Repeat
    ;Gestion des évènements de la fenêtre
    ;====================================
    
    PGL_EventWindow = WindowEvent()    
    
    Select PGL_EventWindow  
      Case #WM_RBUTTONUP,#WM_LBUTTONUP
        PGL_MousePointer = 0
        PGL_MousePointerPressed = 0
        
      Case #WM_RBUTTONDOWN,#WM_LBUTTONDOWN,#WM_LBUTTONDBLCLK ;<====
        PGL_MousePointer = 1 
      Case #PB_Event_CloseWindow
        End
    EndSelect 
  Until PGL_EventWindow=0
  
  
  
  ClearScreen(0)
  ; physic
  If y < screenheight -64
    y + 2
  EndIf
  
  If GetMousePressed() = 1
    Y = y-50
  EndIf
  
  DisplaySprite(0,150,y)
  FlipBuffers()
  
ForEver

M.

Re: Mouse pressed

Publié : ven. 09/oct./2015 9:51
par blendman
Merci.
OUi, j'avais aussi pensé au doubleclic, mais finalement, j'ai opté pour la solution initmouse(), car ça rend le code multiplatforme (ou presque) ^^

Re: Mouse pressed

Publié : sam. 10/oct./2015 23:21
par crisot
Je viens de tester, il semblerait que le problème vienne de #WM_RBUTTONDOWN et #WM_LBUTTONDOWN, tous ces events ne ont pas reportés correctement.

Si je fais 2 clics espacés, les 2 clics sont vu. Si je fais 2 clics très rapides, seul le premier est pris en compte.

Bref, en clair (code raccourci):

Code : Tout sélectionner

   If PGL_EventWindow
      Select PGL_EventWindow 
         Case #WM_RBUTTONDOWN,#WM_LBUTTONDOWN
            Y-50
      EndSelect
   EndIf
Ne fonctionnera pas à chaque fois. En revanche, les buttonUP et buttonDOWN semble être reportés correctement, et donc:

Code : Tout sélectionner

   If PGL_EventWindow
      Select PGL_EventWindow 
         Case #WM_RBUTTONUP,#WM_LBUTTONUP
            Y-50
      EndSelect
   EndIf
Fonctionne parfaitement alors que le code est identique, mais au relâchement du bouton évidement.

Bref, c'est un bug, pas un problème dans ton code.

Re: Mouse pressed

Publié : dim. 11/oct./2015 21:28
par crisot
Ah oui pour le coup ça se tiens. Tout de même étrange (ou dommage) que l'Os ne retourne pas le 2e BUTTONDOWN, puisqu'après tout, il retourne bien le 2e BUTTONUP, et que les click/dblclk/up/down sont des event différents.

Mais à priori... oui! :)

EDIT: En fait ça répond aussi à un autre comportement étrange que j'avais en testant le code de notre ami. C'est bel et bien ça!