
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
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

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

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
;}
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.