souris et crash application

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Uhuru
Messages : 15
Inscription : jeu. 07/avr./2016 21:44

Re: souris et crash application

Message par Uhuru »

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 ;)
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: souris et crash application

Message par blendman »

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 ^^) :

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) 
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: souris et crash application

Message par Ar-S »

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.
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.
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
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: souris et crash application

Message par Ar-S »

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
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: souris et crash application

Message par Mesa »

On gère la capture de la souris avec ReleaseMouse(), voir l'exemple dans la doc.

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

M.
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: souris et crash application

Message par falsam »

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%
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: souris et crash application

Message par Mesa »

Et là, ça bug toujours ?

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)

M.
Répondre