[Résolu] MouseRelease() et double fenêtre

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

[Résolu] MouseRelease() et double fenêtre

Message par blendman »

Yo la foule en délire, c'est encore moi :).

Bon, comme vous le savez, purebasic est un peu récalcitrant dès qu'on utilise la souris et examineMouse().
La souris est automatiquement capturée dans la fenêtre du jeu, et du coup, il faut utiliser une procédure pour éviter ça.
C'est pas tiptop car si le jeu plante, la souris redevient capturée dans l'écran ou la fenêtre.

Mais bon, on fait avec, faut éviter que ça plante lol.

Donc, pour cela, j'ai trouvé une procédure fort sympathique de netmaestro, que j'ai un peu adaptée à mes besoins.

La voici :

Code : Tout sélectionner

Procedure gestion_souris() 
; créeée par netmaestro 
  mx = WindowMouseX(0):my = WindowMouseY(0)
      If inscreen = 1
        If mx>= WindowWidth(0)-4 Or my>= WindowHeight(0)-4 Or mx<=1 Or my<=1
          inscreen = 0
          ReleaseMouse(1) ; on libère la souris
        EndIf    
      ElseIf (mx <WindowWidth(0)-4 And my < WindowHeight(0)-4 And mx > 0 And my > 0) 
          ReleaseMouse(0)  
          MouseLocate(mx,my)
          inscreen = 1     
    EndIf    
EndProcedure
inscreen est une variable globale que je définit à 1 au lancement de mon jeu.

Mais j'ai un problème en utilisant ce code dans mon jeu.
J'ai compris le problème, mais je n'arrive pas à le résoudre (pour le moment :P)

Le problème est que je ferme un écran (le 1er écran : les menus) pour en ouvrir un autre (le 2ème : le jeu).

A ce moment-là, la souris est "dé-capturée" on dirait.
Donc, le jeu ne juge plus qu'elle est dans l'écran du jeu.
Alors, si je bouge ma souris, à l'intérieur de l'écran du jeu, les events souris ne marchent pas (clic, déplacement, molette..).

Pour que la souris soit à nouveau active ingame, je dois sortir de la fenêtre du jeu (par exemple allez sur la bordure en haut, avec les boutons maximiser, la croix, etc.. ou placer la souris sur la barre des taches et ensuite revenir ingame.
et là, la souris et à nouveau capturée et les events souris refonctionnent :P.

Une idée de ce que je pourrais faire pour éviter ça ?

Un code pour tester le problème :

Code : Tout sélectionner

;{ ********************* variables ******************************
Global inscreen = 1
Global quit = 0
ShowCursor_(1)
;}


;{ ********************* declare ********************************
Declare gestion_souris()
Declare Init()
Declare main1()
Declare main2()
Declare SpriteAdd()
;}


;{ ********************* programmes ******************************
Init()
main1()
main2()
;}


;{ ********************* procedures ******************************

Procedure main1()   
OpenWindow(0,0,0,400,300,"test souris - ecran 1",#PB_Window_ScreenCentered|#PB_Window_MaximizeGadget)
OpenWindowedScreen(WindowID(0),0,0,400,300,0,0,0)
SpriteAdd()
Repeat
  ClearScreen(RGB(125,125,125))
  event = WindowEvent() 
  ExamineMouse() 
  If MouseButton(#PB_MouseButton_Left)
    quit = 1
  EndIf 
  DisplaySprite(0,MouseX(),MouseY())   
  gestion_souris()
  FlipBuffers()
Until event = #PB_Event_CloseWindow Or quit = 1
quit = 0   
EndProcedure
 
 
Procedure main2()   
OpenWindow(0,0,0,800,600,"test souris - ecran 2",#PB_Window_ScreenCentered|#PB_Window_MaximizeGadget)
OpenWindowedScreen(WindowID(0),0,0,800,600,0,0,0)
SpriteAdd()
Repeat
  ClearScreen(RGB(80,80,80))
  event = WindowEvent()   
  ExamineMouse()
  If MouseButton(#PB_MouseButton_right)
    quit = 2
  EndIf
  DisplaySprite(0,MouseX(),MouseY())
  gestion_souris()
  FlipBuffers()
Until event = #PB_Event_CloseWindow   Or quit = 2
EndProcedure


Procedure gestion_souris() 
    mx = WindowMouseX(0):my = WindowMouseY(0)
    ;If inscreen = 1
      If mx>= WindowWidth(0)-4 Or my>= WindowHeight(0)-4 Or mx<=1 Or my<=1
        ;inscreen = 0
        ReleaseMouse(1) ; on libère la souris
      ;EndIf     
    ElseIf (mx <WindowWidth(0)-4 And my < WindowHeight(0)-4 And mx > 0 And my > 0)
        ReleaseMouse(0) 
        MouseLocate(mx,my)
        ;inscreen = 1     
    EndIf
EndProcedure


Procedure init()   
   InitSprite()
   InitMouse()
   InitKeyboard()         
EndProcedure


Procedure SpriteAdd()   
   CreateSprite(0,64,64,#PB_Sprite_Texture)
   StartDrawing(SpriteOutput(0))
   Box(0,0,64,64,RGB(255,200,150))
   StopDrawing()
EndProcedure
;}
EDIT :
j'ai un peu modifié le code.
lorsque l'on clique droit dans le 2ème écran on devrait arrêter le jeu normalement, et ça ne marche pas ici.
Dernière modification par blendman le sam. 30/avr./2011 18:24, modifié 1 fois.
zaphod
Messages : 135
Inscription : dim. 07/déc./2008 9:32

Re: PB de MouseRelease(0)

Message par zaphod »

...
Dernière modification par zaphod le dim. 27/mai/2012 7:33, modifié 1 fois.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: PB de MouseRelease(0)

Message par blendman »

salut zaphod

Merci pour ton message, mais ça ne marche pas.
Le but n'est pas de capturer la souris à l'intérieur de l'écran de jeu, mais au contraire de laisser la possibilité de sortir de cet écran tout en gardant les évènements souris, donc, ta correction ne va pas hélas ;).

EDIT :
ah mais si ça fonctionne si on réactive les procédures gestion_souris() !!
Super, merci ;).

EDIT 2 :
j'ai un deuxième "problème" avec ce code, si je mets dans la procédure main2() un clic gauche, le programme se ferme automatiquement, car visiblement il garde en mémoire le fait d'avoir cliquer dans la première fenêtre, savez-vous s'il y a moyen de réinitialiser l'état de la souris ?

la procédure main2() changée :

Code : Tout sélectionner

;{ ********************* variables ******************************
Global inscreen = 1
Global quit = 0
ShowCursor_(1)
;}


;{ ********************* declare ********************************
Declare gestion_souris()
Declare Init()
Declare main1()
Declare main2()
Declare SpriteAdd()
;}


;{ ********************* programmes ******************************
Init()
main1()
main2()
;}


;{ ********************* procedures ******************************

Procedure main1()   
OpenWindow(0,0,0,400,300,"test souris - ecran 1",#PB_Window_ScreenCentered|#PB_Window_MaximizeGadget)
OpenWindowedScreen(WindowID(0),0,0,400,300,0,0,0)
SpriteAdd()
Repeat
  ClearScreen(RGB(125,125,125))
  event = WindowEvent() 
  ExamineMouse() 
  If MouseButton(#PB_MouseButton_Left)
    quit = 1
  EndIf 
  DisplaySprite(0,MouseX(),MouseY())   
  gestion_souris()
  FlipBuffers()
Until event = #PB_Event_CloseWindow Or quit = 1
quit = 0
ReleaseMouse(1) ; <<<<<<<<<<<<ici
EndProcedure
 
 
 
Procedure main2()   
OpenWindow(0,0,0,800,600,"test souris - ecran 2",#PB_Window_ScreenCentered|#PB_Window_MaximizeGadget)
OpenWindowedScreen(WindowID(0),0,0,800,600,0,0,0)
SpriteAdd()
ReleaseMouse(0)  ;<<<<<<<<ici
Repeat
  ClearScreen(RGB(80,80,80))
  event = WindowEvent()   
  ExamineMouse()
  If MouseButton(#PB_MouseButton_Left)  ;<<<<<<<<<<bouton gauche, aussi, pour sortir, le programme se ferme <<<<<<<<
    quit = 1
  EndIf
  DisplaySprite(0,MouseX(),MouseY())
  gestion_souris()
  FlipBuffers()
Until event = #PB_Event_CloseWindow Or quit=1   
EndProcedure

Procedure gestion_souris() 
    mx = WindowMouseX(0):my = WindowMouseY(0)
    If inscreen = 1
      If mx>= WindowWidth(0)-4 Or my>= WindowHeight(0)-4 Or mx<=1 Or my<=1
        inscreen = 0
        ReleaseMouse(1) ; on libère la souris
      EndIf     
    ElseIf (mx <WindowWidth(0)-4 And my < WindowHeight(0)-4 And mx > 0 And my > 0)
        ReleaseMouse(0) 
        MouseLocate(mx,my)
        inscreen = 1     
    EndIf
EndProcedure
   
Procedure init()   
   InitSprite()
   InitMouse()
   InitKeyboard()         
EndProcedure

Procedure SpriteAdd()   
   CreateSprite(0,64,64,#PB_Sprite_Texture)
   StartDrawing(SpriteOutput(0))
   Box(0,0,64,64,RGB(255,200,150))
   StopDrawing()
EndProcedure
;}
zaphod
Messages : 135
Inscription : dim. 07/déc./2008 9:32

Re: PB de MouseRelease(0)

Message par zaphod »

...
Dernière modification par zaphod le dim. 27/mai/2012 7:33, modifié 1 fois.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: PB de MouseRelease(0)

Message par blendman »

Ah oui, pas mal du tout comme ça :D
(j'avais trouvé une autre technique, mais ça demandait 2 ou 3 variable en plus, la tienne est plus cool :))

Merci ;)
Répondre