Mouse pressed

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Mouse pressed

Message 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.
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Mouse pressed

Message 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
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Mouse pressed

Message 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 
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Mouse pressed

Message 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
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Mouse pressed

Message 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.
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Mouse pressed

Message 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
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Mouse pressed

Message 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.
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Mouse pressed

Message 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.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Mouse pressed

Message 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) ^^
crisot
Messages : 98
Inscription : lun. 30/août/2004 21:03

Re: Mouse pressed

Message 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.
crisot
Messages : 98
Inscription : lun. 30/août/2004 21:03

Re: Mouse pressed

Message 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!
Répondre