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!