Merci pour le temps que tu passes sur mes cas
souris et crash application
Re: souris et crash application
donc il est normal que le click souris mette en pause les traitements SAUF la musique d'après toi ?
Merci pour le temps que tu passes sur mes cas
Merci pour le temps que tu passes sur mes cas
Re: souris et crash application
A mon avis, tu dois encore avoir une erreur dans ton code avec la souris ^^, car je ne pense pas que le clic souris mette en pause ton application sauf la musique.
Par contre, avec le screen, si tu utilises examineMouse(), ça bloque la souris dans l'écran, et ça c'est assez galère.
Pour ton code précédent, il vaut mieux créer tes procédure avant d'ouvrir ta fenêtre et ton écran (sauf si tu as mis les déclarations de tes procédures avant d'ouvrir ta fenêtre et ton écran).
Et n'oublies pas la double boucle pour vider les évènements (je sais que ça a déjà été corrigé, mais bon, deux petits rappels ne sont jamais de trop ^^) :
Par contre, avec le screen, si tu utilises examineMouse(), ça bloque la souris dans l'écran, et ça c'est assez galère.
Pour ton code précédent, il vaut mieux créer tes procédure avant d'ouvrir ta fenêtre et ton écran (sauf si tu as mis les déclarations de tes procédures avant d'ouvrir ta fenêtre et ton écran).
Et n'oublies pas la double boucle pour vider les évènements (je sais que ça a déjà été corrigé, mais bon, deux petits rappels ne sont jamais de trop ^^) :
Code : Tout sélectionner
If InitSprite()=0:MessageRequester("Oops!","Video could not be initialized, quitting!"):End:EndIf
If InitKeyboard()=0:MessageRequester("Oops!","Keyboard could not be initialized, quitting!"):End:EndIf
#scrx=640 ; résolution x de l'écran
#scry=480 ; résolution y de l'écran
#numstars=128 ; nombre d'étoiles par plan
#starplan=3 ; nombre de plans
Structure StarVars
star_x.l
star_y.l
star_speed.F
star_colour.l
EndStructure
Global Dim Stars.StarVars(#starplan,#numstars)
; Il vaut mieux placer les procédures avant l'ouverture de la fenêtre
Procedure _2DStarfield()
For S=1 To #starplan
For F=0 To #numstars-1
Stars(S,F)\star_x=Random(#scrx)
Stars(S,F)\star_y=Random(480,0)
Next F
Next S
For F=0 To #numstars-1
Stars(1,F)\star_speed=3 : Stars(1,F)\star_colour=RGB(64,64,64)
Stars(2,F)\star_speed=4 : Stars(2,F)\star_colour=RGB(128,128,128)
Stars(3,F)\star_speed=5 : Stars(3,F)\star_colour=RGB(255,255,255)
Next F
EndProcedure
Procedure bouge2DStarfield()
For S=1 To #starplan
For F=0 To #numstars-1
Box(Stars(S,F)\star_x,Stars(S,F)\star_y,1,1,Stars(S,F)\star_colour)
Stars(S,F)\star_x-Stars(S,F)\star_speed
If Stars(S,F)\star_x<=0:Stars(S,F)\star_x=#scrx:EndIf
Next F
Next S
EndProcedure
If FS=0
OpenWindow(1,0,0,#scrx,#scry,"",#PB_Window_ScreenCentered|#PB_Window_WindowCentered)
OpenWindowedScreen(WindowID(1),0,0,#scrx,#scry)
Else
OpenScreen(#scrx,#scry,32,"",#PB_Screen_WaitSynchronization,60)
EndIf
_2DStarfield() ; creation du starfield
Repeat
; toujours vider la liste des events (voir WaitWindowEvent() pour plus d'infos)
Repeat
; on vérifie les evenements, si on n'en a pas, on peut sortir de cette boucle-ci
If FS
event = WaitWindowEvent(1)
Else
Delay(1)
EndIf
Until Event =0
if ExamineKeyboard() : endif
ClearScreen(RGB(0,0,0))
If StartDrawing(ScreenOutput())
bouge2DStarfield()
StopDrawing()
EndIf
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
http://blendman.blogspot.com/
Forum PB fr : http://www.purebasic.fr/french - Forum PB Eng : http://www.purebasic.fr/english
Forum PB fr : http://www.purebasic.fr/french - Forum PB Eng : http://www.purebasic.fr/english
Re: souris et crash application
C'est galère oui (carrément) mais c'est comme ça pour n'importe quel jeu. On est obligé de sortir de la fenêtre pour reprendre la main sur la souris, donc faut pas trop focaliser là dessus.blendman a écrit : Par contre, avec le screen, si tu utilises examineMouse(), ça bloque la souris dans l'écran, et ça c'est assez galère.
Sauf pour les demos ou là la souris n'a pas a être surveillée.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Re: souris et crash application
Le même code que Blendman avec un petit curseur et une détection des bords (pour l'exemple)
Code : Tout sélectionner
Declare CreaCurseur()
If InitSprite()=0:MessageRequester("Oops!","Video could not be initialized, quitting!"):End:EndIf
If InitKeyboard()=0:MessageRequester("Oops!","Keyboard could not be initialized, quitting!"):End:EndIf
If InitMouse()=0:MessageRequester("Oops!","Mouse could not be initialized, quitting!"):End:EndIf
Enumeration Souris
#CURSEUR
EndEnumeration
#scrx=640 ; résolution x de l'écran
#scry=480 ; résolution y de l'écran
#numstars=128 ; nombre d'étoiles par plan
#starplan=3 ; nombre de plans
Structure StarVars
star_x.l
star_y.l
star_speed.F
star_colour.l
EndStructure
Global Dim Stars.StarVars(#starplan,#numstars)
Global MX, MY
; Il vaut mieux placer les procédures avant l'ouverture de la fenêtre
Procedure _2DStarfield()
For S=1 To #starplan
For F=0 To #numstars-1
Stars(S,F)\star_x=Random(#scrx)
Stars(S,F)\star_y=Random(480,0)
Next F
Next S
For F=0 To #numstars-1
Stars(1,F)\star_speed=3 : Stars(1,F)\star_colour=RGB(64,64,64)
Stars(2,F)\star_speed=4 : Stars(2,F)\star_colour=RGB(128,128,128)
Stars(3,F)\star_speed=5 : Stars(3,F)\star_colour=RGB(255,255,255)
Next F
EndProcedure
Procedure CreaCurseur()
CreateSprite(#CURSEUR,5,5,#PB_Sprite_AlphaBlending)
StartDrawing(SpriteOutput(#CURSEUR))
Box(0,0,5,5,$FFFFFF)
StopDrawing()
EndProcedure
Procedure ShowCurseur()
DisplaySprite(#CURSEUR,MX,MY)
EndProcedure
Procedure bouge2DStarfield()
For S=1 To #starplan
For F=0 To #numstars-1
Box(Stars(S,F)\star_x,Stars(S,F)\star_y,1,1,Stars(S,F)\star_colour)
Stars(S,F)\star_x-Stars(S,F)\star_speed
If Stars(S,F)\star_x<=0:Stars(S,F)\star_x=#scrx:EndIf
Next F
Next S
EndProcedure
If FS=0
OpenWindow(1,0,0,#scrx,#scry,"",#PB_Window_ScreenCentered|#PB_Window_WindowCentered)
OpenWindowedScreen(WindowID(1),0,0,#scrx,#scry)
CreaCurseur()
Else
OpenScreen(#scrx,#scry,32,"",#PB_Screen_WaitSynchronization,60)
CreaCurseur()
EndIf
_2DStarfield() ; creation du starfield
Repeat
; toujours vider la liste des events (voir WaitWindowEvent() pour plus d'infos)
Repeat
; on vérifie les evenements, si on n'en a pas, on peut sortir de cette boucle-ci
If FS
event = WaitWindowEvent(1)
Else
Delay(1)
EndIf
Until Event =0
If ExamineKeyboard() And ExamineMouse() : EndIf
MX = MouseX()
MY = MouseY()
ClearScreen(RGB(0,0,0))
If StartDrawing(ScreenOutput())
bouge2DStarfield()
If MX = 0 Or MX > 635 Or MY = 0 Or MY > 475
DrawText(240, 240, "Press escape to leave",$FFFFFF)
EndIf
StopDrawing()
EndIf
ShowCurseur()
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Re: souris et crash application
On gère la capture de la souris avec ReleaseMouse(), voir l'exemple dans la doc.
M.
Code : Tout sélectionner
Declare CreaCurseur()
If InitSprite()=0:MessageRequester("Oops!","Video could not be initialized, quitting!"):End:EndIf
If InitKeyboard()=0:MessageRequester("Oops!","Keyboard could not be initialized, quitting!"):End:EndIf
If InitMouse()=0:MessageRequester("Oops!","Mouse could not be initialized, quitting!"):End:EndIf
Enumeration Souris
#CURSEUR
EndEnumeration
#scrx=640 ; résolution x de l'écran
#scry=480 ; résolution y de l'écran
#numstars=128 ; nombre d'étoiles par plan
#starplan=3 ; nombre de plans
Structure StarVars
star_x.l
star_y.l
star_speed.F
star_colour.l
EndStructure
Global Dim Stars.StarVars(#starplan,#numstars)
Global MX, MY
; Il vaut mieux placer les procédures avant l'ouverture de la fenêtre
Procedure _2DStarfield()
For S=1 To #starplan
For F=0 To #numstars-1
Stars(S,F)\star_x=Random(#scrx)
Stars(S,F)\star_y=Random(480,0)
Next F
Next S
For F=0 To #numstars-1
Stars(1,F)\star_speed=3 : Stars(1,F)\star_colour=RGB(64,64,64)
Stars(2,F)\star_speed=4 : Stars(2,F)\star_colour=RGB(128,128,128)
Stars(3,F)\star_speed=5 : Stars(3,F)\star_colour=RGB(255,255,255)
Next F
EndProcedure
Procedure CreaCurseur()
CreateSprite(#CURSEUR,5,5,#PB_Sprite_AlphaBlending)
StartDrawing(SpriteOutput(#CURSEUR))
Box(0,0,5,5,$FFFFFF)
StopDrawing()
EndProcedure
Procedure ShowCurseur()
DisplaySprite(#CURSEUR,MX,MY)
EndProcedure
Procedure bouge2DStarfield()
For S=1 To #starplan
For F=0 To #numstars-1
Box(Stars(S,F)\star_x,Stars(S,F)\star_y,1,1,Stars(S,F)\star_colour)
Stars(S,F)\star_x-Stars(S,F)\star_speed
If Stars(S,F)\star_x<=0:Stars(S,F)\star_x=#scrx:EndIf
Next F
Next S
EndProcedure
;Maerge autour du screen
MargeG=0
MargeH=0
If FS=0
OpenWindow(1,0,0,#scrx,#scry,"",#PB_Window_ScreenCentered|#PB_Window_WindowCentered)
OpenWindowedScreen(WindowID(1),0,0,#scrx,#scry)
CreaCurseur()
Else
OpenScreen(#scrx,#scry,32,"",#PB_Screen_WaitSynchronization,60)
CreaCurseur()
EndIf
_2DStarfield() ; creation du starfield
Repeat
; toujours vider la liste des events (voir WaitWindowEvent() pour plus d'infos)
Repeat
; on vérifie les evenements, si on n'en a pas, on peut sortir de cette boucle-ci
If FS
event = WaitWindowEvent(1)
Else
Delay(1)
EndIf
Until Event =0
If FS=0
; Gestion de la capture de la souris dans le screen
If inScreen = #True ; Si la souris est dans le screen...
If MouseX() > #scrx-2 Or MouseY() > #scry-2 Or MouseX() < 1 Or MouseY() <1
ReleaseMouse(#True) ; ...et si elle s'approche des bords du screen alors on libère la souris
inScreen = #False
EndIf
Else
mx = WindowMouseX(1) ; Sinon, si la souris entre dans le screen...
my = WindowMouseY(1)
If mx < #scrx + MargeG And mx > MargeG And my > MargeH And my < MargeH + #scry
ReleaseMouse(#False) ; ... alors on capture la souris
MouseLocate(mx-MargeG,my-MargeH)
inScreen = #True
EndIf
EndIf
EndIf
;If inScreen ; Déclenche l'affichage si la souris est dans l'écran noir...
If ExamineKeyboard() And ExamineMouse() : EndIf
If KeyboardPushed(#PB_Key_Escape) : End : EndIf
MX = MouseX()
MY = MouseY()
ClearScreen(RGB(0,0,0))
If StartDrawing(ScreenOutput())
bouge2DStarfield()
If MX = 0 Or MX > 635 Or MY = 0 Or MY > 475
DrawText(240, 240, "Press escape to leave",$FFFFFF)
EndIf
StopDrawing()
EndIf
If inScreen = #True ; Si la souris est dans le screen...
ShowCurseur()
EndIf
;EndIf
FlipBuffers()
ForEver
- falsam
- Messages : 7334
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: souris et crash application
Mesa ton code bug si tu sors plusieurs fois de la fenêtre et que tu essayes de déplacer la fenêtre.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Re: souris et crash application
Et là, ça bug toujours ?
T'es en 64 ou 32b ?
J'ai ajouté la gestion du ALT TAB.
M.
T'es en 64 ou 32b ?
J'ai ajouté la gestion du ALT TAB.
Code : Tout sélectionner
;****************************************************************
; Program: WindowedScreen + GUI Eventhandling Demo
; Author: netmaestro
; Date: March 22, 2007
; License: Free, unrestricted, credit appreciated
; but not required
;****************************************************************
; changed by LJ on 8.7.2008, trying to make it run on Linux
; Ajout Mesa
Declare CreaCurseur()
Declare _2DStarfield()
If InitSprite()=0:MessageRequester("Oops!","Video could not be initialized, quitting!"):End:EndIf
If InitKeyboard()=0:MessageRequester("Oops!","Keyboard could not be initialized, quitting!"):End:EndIf
If InitMouse()=0:MessageRequester("Oops!","Mouse could not be initialized, quitting!"):End:EndIf
Enumeration Souris
#CURSEUR
EndEnumeration
#ScreenW=640 ; résolution x de l'écran
#ScreenH=480 ; résolution y de l'écran
#numstars=128; nombre d'étoiles par plan
#starplan=3 ; nombre de plans
Structure StarVars
star_x.l
star_y.l
star_speed.F
star_colour.l
EndStructure
Global Dim Stars.StarVars(#starplan,#numstars)
Global MX, MY
Procedure.i GestionAltTab()
ReleaseMouse(#True)
CloseScreen ()
OpenWindow (1,1,1,1,1, "Starfield" , #PB_Window_Minimize )
Repeat
Ev= WaitWindowEvent(1)
Until Ev= #PB_Event_ActivateWindow
CloseWindow (1)
; Il faut tout refaire
OpenScreen(#ScreenW,#ScreenH,32,"Starfield",#PB_Screen_WaitSynchronization,60)
CreaCurseur()
_2DStarfield()
ReleaseMouse(#False)
ProcedureReturn #True
EndProcedure
; Il vaut mieux placer les procédures avant l'ouverture de la fenêtre
Procedure _2DStarfield()
For S=1 To #starplan
For F=0 To #numstars-1
Stars(S,F)\star_x=Random(#ScreenW)
Stars(S,F)\star_y=Random(480,0)
Next F
Next S
For F=0 To #numstars-1
Stars(1,F)\star_speed=3 : Stars(1,F)\star_colour=RGB(64,64,64)
Stars(2,F)\star_speed=4 : Stars(2,F)\star_colour=RGB(128,128,128)
Stars(3,F)\star_speed=5 : Stars(3,F)\star_colour=RGB(255,255,255)
Next F
EndProcedure
Procedure CreaCurseur()
CreateSprite(#CURSEUR,5,5,#PB_Sprite_AlphaBlending)
StartDrawing(SpriteOutput(#CURSEUR))
Box(0,0,5,5,$FFFFFF)
StopDrawing()
EndProcedure
Procedure ShowCurseur()
DisplaySprite(#CURSEUR,MX,MY)
EndProcedure
;Marge autour du screen
#LeftOffset = 20
#TopOffset = 20
;***********************
Global FS=0
;***********************
If FS=0
OpenWindow(0,0,0,#ScreenW,#ScreenH,"Starfield",#PB_Window_ScreenCentered|#PB_Window_WindowCentered|#PB_Window_SystemMenu)
OpenWindowedScreen(WindowID(0),0,0,#ScreenW,#ScreenH)
CreaCurseur()
Else
OpenScreen(#ScreenW,#ScreenH,32,"Starfield",#PB_Screen_WaitSynchronization,60)
CreaCurseur()
EndIf
_2DStarfield() ; creation du starfield
Procedure bouge2DStarfield(inscreen)
ClearScreen(0)
;
; Display your screen stuff
StartDrawing(ScreenOutput())
For S=1 To #starplan
For F=0 To #numstars-1
Box(Stars(S,F)\star_x,Stars(S,F)\star_y,1,1,Stars(S,F)\star_colour)
Stars(S,F)\star_x-Stars(S,F)\star_speed
If Stars(S,F)\star_x<=0:Stars(S,F)\star_x=#ScreenW:EndIf
Next F
Next S
StopDrawing()
;
If inscreen Or FS=1
ExamineMouse()
StartDrawing(ScreenOutput())
DrawText(250,200," Souris capturée ",#Yellow, #Black)
DrawText(260,230,"( "+RSet(Str(MouseX()),3,"0")+", "+RSet(Str(MouseY()),3,"0")+" )",#White,#Black)
If MouseButton(#PB_MouseButton_Left)
Debug "clic left"
EndIf
If MouseButton(#PB_MouseButton_Middle)
Debug "clic Middle"
EndIf
If MouseButton(#PB_MouseButton_Right)
Debug "clic Right"
EndIf
StopDrawing()
DisplaySprite(0,MouseX(),MouseY())
EndIf
EndProcedure
Repeat
If inscreen
If MouseX()>#ScreenW-2 Or MouseY()>#ScreenH-2 Or MouseX()<1 Or MouseY()<1
ReleaseMouse(1); La souris est libérée de l'écran
inscreen = #False
EndIf
Else
If FS=0
Repeat
;Gestion des évènements de la fenêtre
;====================================
;Essayez les 3 possibilités mais une seule à la fois
Ev = WindowEvent() ; Animation
;Ev = WaitWindowEvent() ; Blocage de l'animation
;Ev = WaitWindowEvent(1) ; Animation mais délai d'1 ms inutile et de plus c'est une mauvaise
; façon de programmer car la pile des évènements n'est pas vidée
;Attention, si la fenêtre devait avoir des gadgets (buttongadget,...), il faudrait utiliser une autre façon de faire avec WaitWindowEvent(). VOir l'aide de WaitWindowEvent()
Select Ev
Case #PB_Event_CloseWindow
End
EndSelect
Until Ev=0
mx = WindowMouseX(0):my = WindowMouseY(0)
If Bool(mx < #ScreenW+#LeftOffset And mx > #LeftOffset And my > #TopOffset And my < #TopOffset+#ScreenH)
ReleaseMouse(0) ;La souris est capturée dans l'écran
MouseLocate(mx-#LeftOffset,my-#TopOffset)
inscreen = #True
EndIf
EndIf
EndIf
bouge2DStarfield(inscreen)
FlipBuffers()
If IsScreenActive() = 0
If FS=1
GestionAltTab()
Else
SetWindowState(0, #PB_Window_Minimize)
EndIf
EndIf
ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)