Page 1 sur 1

Problème d'utilisation de la souris

Publié : sam. 03/mai/2014 12:26
par Zanshi
Bonjour à tous et à toutes,
Actuellement, j'ai un problème avec les fonction pour la souris...

Code : Tout sélectionner

InitMouse()
InitSprite()

#window=0

OpenWindow(#window,50,50,800,640,"",#PB_Window_SystemMenu)
OpenWindowedScreen(WindowID(#window),0,0,800,640,0,0,0)
x=320
y=400
MouseLocate(400,320)

Repeat
  ExamineMouse()
  x=MouseX()
  y=MouseY()
  If MouseButton(#PB_MouseButton_Left)=1
    StartDrawing(ScreenOutput())
    Circle(x,y,6,#Red)
    StopDrawing()
  EndIf
Until WaitWindowEvent()=#PB_Event_CloseWindow
Et quand je l'éxécute, la fenêtre s'ouvre et je ne peut rien faire...
Quelqu'un peut m'aider ?

Re: Problème d'utilisation de la souris

Publié : sam. 03/mai/2014 14:30
par TazNormand
Ne pas oublier les "flipbuffers", quant à la capture de la souris, marche pas sur un "openwindowedscreen", et préférer WindowEvent() à WaitWindowEvent()

Code : Tout sélectionner

InitMouse()
InitSprite()
InitKeyboard()

#window=0

OpenWindow(#window,50,50,800,640,"",#PB_Window_SystemMenu)
OpenWindowedScreen(WindowID(#window),0,0,800,640,0,0,0)
x=320
y=400
MouseLocate(400,320)
ClearScreen(RGB(0,0,0))
StartDrawing(ScreenOutput())
DrawText(1,1,"Appuyez sur Échap pour quitter",RGB(255,0,0))
StopDrawing()
Repeat
  ExamineMouse()  
  ExamineKeyboard()
  evt=WindowEvent()
	x=MouseX()
	y=MouseY()
	
	StartDrawing(ScreenOutput())
	  If MouseButton(#PB_MouseButton_Left)
	    Circle(x,y,6,#Red)
	  EndIf
	  
	StopDrawing()
	FlipBuffers()	
Until KeyboardPushed(#PB_Key_Escape)
CloseScreen()
CloseWindow(#window)

Re: Problème d'utilisation de la souris

Publié : sam. 03/mai/2014 17:07
par graph100
Simplement il faut garder à l'esprit que ExamineMouse() va 'capturer' la souris ! C'est bien pratique pour un jeu par exemple, mais pour la plupart des applications sur une fenêtre, ça n'est pas adapté.

@Taz : qu'es-ce tu entends par 'la capture de la souris, marche pas sur un "openwindowedscreen" ' ? Ca marche !
pour le reste je suis d'accord.

Code : Tout sélectionner

InitMouse()
InitSprite()

#window=0

OpenWindow(#window,50,50,800,640,"",#PB_Window_SystemMenu)
OpenWindowedScreen(WindowID(#window),0,0,800,640,0,0,0)

x=320
y=400
MouseLocate(400,320)

Repeat
	event = WindowEvent()
	ExamineMouse()
	
	x = MouseX()
	y = MouseY()
	
	
	StartDrawing(ScreenOutput())
	
	If MouseButton(#PB_MouseButton_Left)=1
		Circle(x,y,6,#Red)
	Else
		Circle(x,y,2,#Blue)
	EndIf
	
	StopDrawing()
	
	FlipBuffers()
Until event = #PB_Event_CloseWindow

Re: Problème d'utilisation de la souris

Publié : sam. 03/mai/2014 17:20
par TazNormand
@ Graph100 : je parlais de la capture concernant la fermeture de la fenêtre (Until WaitWindowEvent()=#PB_Event_CloseWindow )

Re: Problème d'utilisation de la souris

Publié : sam. 03/mai/2014 17:36
par Backup
TazNormand a écrit : , et ne préférer WindowEvent() à WaitWindowEvent()

pas réussi a décoder cette phrase !

@graph100
ton exemple, tu l'a testé avec le gestionnaire des taches ouvert ??
chez moi ton exemple prends 12 au processeur !!

simplement parce que lorsque vous utilisez "WindowEvent() "
faut pas oublier le Delay () qui va avec !!

donc remplacez

Code : Tout sélectionner

event = WindowEvent()
par

Code : Tout sélectionner

event = WindowEvent():Delay(8)
ça ira mieux ;)
le delay ne fait pas que ralentir la boucle, il permet de rendre la main au système ,
sur nos système multitâche, c'est mieux de penser aux autres :)
important sur un OpenWindowedScreen()

l'air de rien ça va augmenter la fluidité

Re: Problème d'utilisation de la souris

Publié : sam. 03/mai/2014 20:16
par graph100
Comme toujours, il faut faire attention au contexte ! Chaque exemple n'est pas forcément optimisé...
L'accent est mis sur le problème en question. A la personne ensuite d'extraire ce dont elle a besoin.

Désolé Dobro, mais chez moi ça ne prend que 2%, bref.
Ensuite, dans une boucle graphique, (le sujet a été mainte fois abordé, c'est inutile de revenir dessus ici), la vitesse est gérée par Flipbuffer() !

@Taz : la capture concernant la fermeture de la fenêtre fonctionne bien : essaye [Alt]+[F4] :mrgreen:
c'est juste que tu peux pas aller cliquer sur le bouton parce que la souris est capturée.

Re: Problème d'utilisation de la souris

Publié : sam. 03/mai/2014 21:11
par Zanshi
Merci à tous pour vos réponse ! J'ai réussi à finir ce que je voulais du coup.

Re: Problème d'utilisation de la souris

Publié : dim. 04/mai/2014 11:39
par TazNormand
@Graph100 : Oui pour Alt+F4, mais le "gadget" de fermeture...

@ Dobro : merci, le ne était en trop :oops: et merci pour le "Delay"

Re: Problème d'utilisation de la souris

Publié : dim. 04/mai/2014 12:55
par Backup
graph100 a écrit : Désolé Dobro, mais chez moi ça ne prend que 2%, bref.
Ensuite, dans une boucle graphique, (le sujet a été mainte fois abordé, c'est inutile de revenir dessus ici), la vitesse est gérée par Flipbuffer() !.
il ne s'agit pas de vitesse, mais d'occupation de la charge processeur !!
dans un ecran fenetré , il y a fenetré , donc tu dois tenir compte des autres applications dans un environnement multitache
de plus, tu es suceptibles d'avoir des gadgets a gerer autour de ton ecran ...(si pas en mode FullScreen)

Delay() n'est pas seulement un ralentisseur , c'est avant tout un moyen de rendre la main au systeme
(l'equivalent de DOEVENT() de memoire en Visual Basic )

pour etre tranquille en mode Ecran fenetré ;il FAUT utiliser WAITWINDOWEVENT(XX) !

en mode WINDOWEVENT() (sur un ecran FENETRé), le delay() est indispensable ... car
pendant le Delay(x) , ton application ne prend plus de charge processeur , et donc ça laisse de la charge pour les autres applications

je suis surpris que sans delay ça ne prenne que 2% chez toi (meme lorsque tu bouge la souris ?? )
car je suis quand meme sur un MSI GT780 avec un I7 ... bref pas vraiment ce qui se fait de plus lent de nos jours...
et j'ai 12% de bouffé ce qui est énorme pour une machine comme la mienne ;)

par compte en mode OpenScreen()
le mode WINDOWEVENT() : va bien :)

Re: Problème d'utilisation de la souris

Publié : dim. 04/mai/2014 13:31
par TazNormand
question bête mais comment gérer le passage "hors" écran graphique (openwindowedscreen) pour gérer le gadget de fermeture de la fenêtre ?

Re: Problème d'utilisation de la souris

Publié : dim. 04/mai/2014 14:55
par falsam
TazNormand a écrit :comment gérer le passage "hors" écran graphique (openwindowedscreen) pour gérer le gadget de fermeture de la fenêtre ?
En testant la position de la souris à l'intérieur et à l'extérieur de l'OpenWindowedScreen. Reste à gérer ReleaseMouse(). Comme c'est facile à dire, je poste un code :)

Reprise d'un code que j'ai posté ici en reprenant ce que j'ai posté ici pour gérer la souris comme tu le souhaites mais dans un monde 3D.

Code : Tout sélectionner

EnableExplicit

Enumeration Form
  #MainForm
EndEnumeration

Enumeration Sprite  
  #Empty
  #Square_Red
  #Square_Green
  #Square_Yellow
  
  #Cursor
EndEnumeration

Global Event
Global Dim Sprites(4, 4), Col, Row, SelCol=-1, SelRow=-1 ;5 Colonnes et 5 lignes

Global WMouseX, WMouseY, MouseRelease

Procedure GamePreload()
  Protected BorderColor = RGB(128, 128, 128)
  
  ;Creation du sprite vide
  CreateSprite(#Empty, 100, 100)
  StartDrawing(SpriteOutput(#Empty))
  Box(0, 0, 100, 100, BorderColor)
  RoundBox(2, 2, 96, 96, 10, 10, BorderColor)  
  StopDrawing()
    
  ;Creation du carré Rouge
  CreateSprite(#Square_Red, 100, 100)
  StartDrawing(SpriteOutput(#Square_Red))
  Box(0, 0, 100, 100, BorderColor)
  RoundBox(2, 2, 96, 96, 10, 10, RGB(255, 0, 0))
  StopDrawing()
  
  ;Creation du carré Vert
  CreateSprite(#Square_Green, 100, 100)
  StartDrawing(SpriteOutput(#Square_Green))
  Box(0, 0, 100, 100, BorderColor)
  RoundBox(2, 2, 96, 96, 10, 10, RGB(50, 205, 50))
  StopDrawing()
  
  ;Creation du carré Jaune
  CreateSprite(#Square_Yellow, 100, 100)
  StartDrawing(SpriteOutput(#Square_Yellow))
  Box(0, 0, 100, 100, BorderColor)
  RoundBox(2, 2, 96, 96, 10, 10, RGB(255, 215, 0))
  StopDrawing()
 
  ;Creation du curseur de sélection
  CreateSprite(#Cursor, 25, 25)
  StartDrawing(SpriteOutput(#Cursor))
  Box(0, 0, 25, 25, RGB(250, 128, 114))
  StopDrawing()
  
EndProcedure

Procedure GameUpdate()
  Protected Mx = MouseX()
  Protected My = MouseY()
  
  ;Affichage des différents carrés de couleurs
  For Col = 0 To 4
    For Row = 0 To 4
      DisplaySprite(Sprites(Col, Row), Col*100, Row*100)
    Next
  Next
  
  ;Affichage du curseur
  If MouseRelease = #False
    DisplayTransparentSprite(#Cursor, Mx, My, 128) 
  EndIf
  
  
  If MouseButton(#PB_MouseButton_Left)
    ;Le bouton gauche de la souris est préssé :
    ; ? Il y a un sprite sue cette case (Sprites(Col, Row) <> 0)
    ; ? ET il n'y a pas de sprite en cours de selection (SelCol = -1) 
    ; OUI => Mémorisation des coordonnées du sprite 
    For Col = 0 To 4
      For Row = 0 To 4
        If Sprites(Col, Row) <> 0 And (Mx > Col*100 And Mx < (Col+1)*100) And (My > Row*100 And My < (Row+1)*100) And SelCol = -1
          SelCol = Col
          SelRow = Row          
        EndIf  
      Next
    Next 
    
  Else
    ;Le bouton de la souris est relaché : 
    ; ? La Case ou se trouve la souris est libre 
    ; ? ET Relacher un sprite (SelCol <> -1)
    ; OUI ==> Permutation des cellules
    For Col = 0 To 4
      For Row = 0 To 4
        If Sprites(Col, Row) = 0 And (Mx > Col*100 And Mx < (Col+1)*100) And (My > Row*100 And My < (Row+1)*100) And SelCol <> -1 
          
          Swap Sprites(Col, Row), Sprites(SelCol, SelRow)
          
        EndIf  
      Next
    Next
        
    ;Plus aucune sélection en cours
    SelCol = -1
    SelRow = -1  
  EndIf  
EndProcedure

Procedure GameStart()
  Protected cr.b = #True
  Protected Width = 500
  Protected Height = 500
    
  ;Initialisation de l'environnement 2D
  If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 And InitSound() = 0
    MessageRequester("Error", "Sprite system can't be initialized", 0)
    cr=#False
  EndIf
  
  
  If OpenWindow(#mainform, 0, 0, Width, Height, "New Game", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
    If OpenWindowedScreen(WindowID(#mainform), 0, 0, Width, Height)
      
      ;Creation des sprites
      GamePreload()
      
      ;Ajout des sprites dans le jeu
      For Col=0 To 4
        For Row=0 To 4
          Sprites(Col, Row) = Random(3, 0)
        Next
      Next
      
    EndIf
  EndIf
  
  ;-Boucle evenementielle
  Repeat  
    Repeat
      Event = WindowEvent()
     
      Select event    
        Case #PB_Event_CloseWindow
          End
      EndSelect  
    Until event=0
    
    FlipBuffers()
    ClearScreen(RGB(0,0,0))
                
    ExamineKeyboard()
    ExamineMouse()
    
    ;- U.T.: Pointeur de la souris en dehors des limites du jeu
    WMouseX = WindowMouseX(#Mainform)
    WMouseY = WindowMouseY(#Mainform)
    
    If MouseRelease = #True
      MouseRelease = #False
    EndIf
    
    MouseLocate(WMouseX, WMouseY)
    If WMouseX > 0 And WMouseX < WindowWidth(#Mainform, #PB_Window_InnerCoordinate)-1 And
       WMouseY > 0 And WmouseY < WindowHeight(#Mainform, #PB_Window_InnerCoordinate)-1
      ReleaseMouse(#False)  
      
    Else
      MouseRelease = #True
      ReleaseMouse(#True)   
    EndIf
    ;Fin U.T.
     
    GameUpdate()
  
  Until KeyboardPushed(#PB_Key_Escape)
EndProcedure

GameStart()
Le traitement se trouve après FlipBuffer.

Re: Problème d'utilisation de la souris

Publié : dim. 04/mai/2014 20:50
par graph100
@Dobro : je suis d'accord avec toi sur le point du multi-tâche.
@ordi à Dobre : si ca prend 12% chez toi et 2% sur le mien, cela veut-il dire que mon pc est 6 fois plus puissant !? :twisted: Mouahahahah ! :twisted:

* Je plaisante * :mrgreen:
On va pas jouer à kikalaplusgrosse, pour info j'ai ça avec 8Go de RAM en plus, et le disque principal changé avec un SSD.
Donc je me disais que probablement ton % venait de la différence de machine, mais ça doit pas venir de là :?: :?:
Bizarre.

Re: Problème d'utilisation de la souris

Publié : dim. 04/mai/2014 23:21
par Backup
TazNormand a écrit :question bête mais comment gérer le passage "hors" écran graphique (openwindowedscreen) pour gérer le gadget de fermeture de la fenêtre ?

juste pour montrer qu'on peut le faire avec un WaitWindowEvent()
et qu'en plus on peut gerer le redimensionnement de l'interface :)

Code : Tout sélectionner

; Exemple de redimention du Screen 
; et de la capture Souris
; Par Dobro
; en Purebasic 5.11

Enumeration
	#win
	#container
	#sprite_curseur
	#bouton
EndEnumeration
Declare  open_win()
Declare  MyWindowCallback(WindowID, Message, wParam, lParam)


If InitSprite()=0 Or InitKeyboard()=0 or InitMouse()=0
	MessageRequester("Erreur", "DirectX 7 ou ultérieur indisponible !", 0)
	End
EndIf

open_win()

CreateSprite(#sprite_curseur,16,16)
StartDrawing(SpriteOutput(#sprite_curseur))
	Box(0,0,16,16,$0000FF)
StopDrawing() 

Repeat
	ExamineKeyboard()
	ExamineMouse()
	
	if WindowMouseX(#win)<WindowWidth(#Win)-70 and WindowMouseY(#win)<WindowHeight(#Win)-72 ; on est dans l'ecran ??? 
		;showcursor_(0) ; Dans l'ecran on affiche le Sprite et efface le curseur souris Windows (api window)
		DisplaySprite(#sprite_curseur,WindowMouseX(#win),WindowMouseY(#win)) ;  oui , alors on affiche le Sprite
		StartDrawing(WindowOutput(#win))
			FrontColor(RGB(255,255,255))
			DrawingMode(1)
			DrawText(1,1,"Position de la souris = " + Str(WindowMouseX(#win)) + " / " + Str(WindowMouseY(#win)))
		StopDrawing()
		Else ; non ! , donc on a quitté l'ecran (enfin.. on n'est plkus dessus , car en mode fenetré on ne quitte jamais vraiment l'ecran.. puisqu'il est enfant d'une fenetre !! 
		; contrairement au mode Full Screen()
		
		;showcursor_(1) ; hors de l'ecran on affice le curseur Soouris window  mais pas le sprite  (api window)
	EndIf
	
	
	event= WaitWindowEvent(2) 
	select event
		Case #PB_Event_Gadget
		Select EventGadget()
			Case #bouton
			MessageRequester("info", "t'as cliqué sur le bouton")
		EndSelect
		Case #PB_Event_CloseWindow
		End
	EndSelect
	FlipBuffers()
	ClearScreen(RGB(0,0,0))
Until KeyboardPushed(#PB_Key_Escape)



;- les procedures
; ******************************************************************************************************

Procedure open_win()
	if OpenWindow(#win,0,0,800, 600,"Window",#PB_Window_SizeGadget|#PB_Window_SystemMenu )
		ButtonGadget(#bouton,10,WindowHeight(#Win)-60,50,50,"bouton")
		ContainerGadget(#container, 2, 2, WindowWidth(#Win)-70,WindowHeight(#Win)-72) 
		If OpenWindowedScreen(GadgetId(#container),0,0,1024, 768,0,0,0) = 0
			MessageRequester("Erreur", "Impossible d'ouvrir un ecran 640x480", 0)
			End
		EndIf
		CloseGadgetList()
		
	Endif
	SetWindowCallback(@MyWindowCallback())
	SetFrameRate(60)
	StickyWindow(#win,1)
EndProcedure

Procedure MyWindowCallback(WindowID, Message, wParam, lParam)
	Result = #PB_ProcessPureBasicEvents
	Select Message
		Case #WM_SIZING
		ResizeGadget(#container,2,2,WindowWidth(#Win)-70,WindowHeight(#Win)-72) ; redimensionne le container ..et donc le windowedscreen()
		ResizeGadget(#bouton,#PB_Ignore,WindowHeight(#Win)-60,#PB_Ignore,#PB_Ignore) ; on reposition aussi le bouton tant qu'a faire
	EndSelect
	ProcedureReturn Result
EndProcedure

; 



; 

; Epb