[Rés] Comment éviter qu'un événement ne se reproduise intemp

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

[Rés] Comment éviter qu'un événement ne se reproduise intemp

Message par Micoute »

Bonjour à tous,
j'ai programmé une horloge avec en plus, les jours de semaines et les jours du mois et un tic pour les secondes.
Malheureusement, si on bouge la souris dans l'image, ce n'est plus un tic qu'on entend, mais un compteur Geiger, d'où ma question comment éviter qu'un événement ne se reproduise intempestivement.

Code : Tout sélectionner

EnableExplicit

Enumeration
  #Fenetre_principale
EndEnumeration
Enumeration 
  #Trotteuse
  #GrandeAiguille
  #PetiteAiguille
  #Spr_Jour_Sem
  #Spr_Jour_Mois
  #Fond
  #Son
EndEnumeration

Enumeration Font
  #FontHeure
  #FontMinute
  #FontHeureGrasse
EndEnumeration

Define.l Evenement, EvenementGadget

Global StyleFen.i=#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered
Global Image.i
Global XC.i, YC.i, Rayon.i ;Coordonnées et rayon du point central du cercle
Global X.f, Y.f            ;Coordonnées des points sur le cercle 
Global N.i, Nj.f, xsec.s, xmin.s, xheure.s, xjour.s, s, m, h, j, jm, TailleImage = 1000, Texte.s, Jour.s, Digit, Tampon.s

If InitSprite()
Else
  End
EndIf

If InitSound()
Else
  End
EndIf

OpenWindow(#Fenetre_principale, 0, 0, TailleImage, TailleImage, "Horloge calendrier", StyleFen)
If OpenWindowedScreen(WindowID(#Fenetre_principale), 0, 0, TailleImage, TailleImage, 1, 0, 0)
  
  CatchSound(#son, ?Son)
  SoundVolume(#son, 20)
  
  CreateSprite(#Spr_Jour_Sem, 800, 800)
  CreateSprite(#Spr_Jour_Mois, 800, 800)
  CreateSprite(#Trotteuse, 800, 800)
  CreateSprite(#GrandeAiguille, 800, 800)
  CreateSprite(#PetiteAiguille, 800, 800)
  CreateSprite(#Fond, 800, 800)
  
  LoadFont(#FontHeure, "Arial", 30, #PB_Font_Bold)
  LoadFont(#FontMinute, "Arial", 15)
  LoadFont(#FontHeureGrasse, "Arial", 40, #PB_Font_Bold)
  
  If StartDrawing(SpriteOutput(#Spr_Jour_Sem))
    
    LineXY(398, 400, 398, 265, $23F5C8)
    LineXY(399, 400, 399, 260, $23F5C8)
    LineXY(400, 400, 400, 255, $23F5C8)
    LineXY(401, 400, 401, 260, $23F5C8)
    LineXY(402, 400, 402, 265, $23F5C8)
    
    Circle(400, 400, 15, $23F5C8)
    StopDrawing()
  EndIf
  
  If StartDrawing(SpriteOutput(#Spr_Jour_Mois))
    
    LineXY(398, 400, 398, 225, $23F5C8)
    LineXY(399, 400, 399, 220, $23F5C8)
    LineXY(400, 400, 400, 215, $23F5C8)
    LineXY(401, 400, 401, 210, $23F5C8)
    LineXY(402, 400, 402, 215, $23F5C8)
    
    Circle(400, 400, 15, $23F5C8) ;Centre
    StopDrawing()
  EndIf
  
  If StartDrawing(SpriteOutput(#Trotteuse))
    LineXY(398, 550, 398, 65, $2323C8)
    LineXY(399, 550, 399, 60, $2323C8)
    LineXY(400, 550, 400, 55, $2323C8)
    LineXY(401, 550, 401, 60, $2323C8)
    LineXY(402, 550, 402, 65, $2323C8)
    
    Circle(400, 530, 10, $2323C8) ; la
    Circle(400, 535,  9, $2323C8) ; queue
    Circle(400, 540,  8, $2323C8) ; de
    Circle(400, 545,  7, $2323C8) ; la
    Circle(400, 550,  6, $2323C8) ; trotteuse
    Circle(400, 400, 15, $2323C8) ;le centre de la trotteuse
    
    Circle(400, 400, 25, $2323C8)
    StopDrawing()
  EndIf
  
  If StartDrawing(SpriteOutput(#GrandeAiguille))
    LineXY(390, 400, 390,  20, $FF)
    LineXY(390,  20, 400,  12, $FF) ;\
    LineXY(400,  12, 410,  20, $FF) ;/
    LineXY(410,  20, 410, 400, $FF)
    LineXY(410, 400, 390, 400, $FF)
    FillArea(400, 300, $FF, $FFFFFF)
    Circle(400, 400, 10, $FF)
    StopDrawing()
  EndIf
  
  If StartDrawing(SpriteOutput(#PetiteAiguille))
    LineXY(390, 160, 390, 410, $FF)
    LineXY(390, 160, 400, 145, $FF) ;pointe \
    LineXY(400, 145, 410, 160, $FF) ;pointe /
    LineXY(410, 160, 410, 410, $FF)
    LineXY(390, 410, 410, 410, $FF)
    FillArea(400, 300, $FF, $FFFFFF)
    StopDrawing()
  EndIf
  
  
  If StartDrawing(SpriteOutput(#Fond)) ;- fond
    
    ;Coordonnées et rayon du point central du cercle
    XC = 400
    YC = 400
    
    Circle(XC, YC, 800, $600000) ;Contour
    ;Point central
    Circle(XC, YC, 400, $E13736)
    
    ;Les secondes (0 à 59)
    Rayon = 350
    For N = 0 To 364 Step 6
      X = XC + Rayon * Cos(N * #PI / 180)
      Y = YC + Rayon * Sin(N * #PI / 180)
      Circle(X,Y,3, $97FB98)
    Next
    
    ;Les jours de semaine (lundi à dimanche)
    Rayon = 150
    Circle(XC, YC, 200, $FF0000)
    DrawText(400-TextWidth("Dim")/2, 235, "Dim", $00FFFF, $FF0000)
    DrawText(515, 290, "Lun", $00FFFF, $FF0000)
    DrawText(545, 425, "Mar", $00FFFF, $FF0000)
    DrawText(455, 535, "Mer", $00FFFF, $FF0000)
    DrawText(345-TextWidth("Jeu"), 535, "Jeu", $00FFFF, $FF0000)
    DrawText(255-TextWidth("Ven"), 435, "Ven", $00FFFF, $FF0000)
    DrawText(280-TextWidth("Sam"), 290, "Sam", $00FFFF, $FF0000)     
    
    ;Les Chiffres des jours (1 à 31)
      Digit=0
      Rayon = 190
      Nj.f = 0
      While Nj < 360
        
        Digit+1
        
        X = XC + Rayon * Cos(Nj * #PI / 180)
        Y = YC + Rayon * Sin(Nj * #PI / 180)
        Tampon=Str(Digit)
        
        DrawingMode(#PB_2DDrawing_Transparent)
        DrawText(X-TextWidth(Tampon)/2, Y-TextHeight(Tampon)/2, Tampon, RGB(255, 255, 0))
        DrawingMode(#PB_2DDrawing_Default)
        Nj + 11.613
      Wend
      
    ;Les Chiffres des heures (1 à 12)
    Digit=2
    Rayon = 270
    DrawingFont(FontID(#FontHeure))        
    For N = 0 To 345 Step 30
      Digit+1
      If Digit>12
        Digit = Mod(12,4) + 1
      EndIf
      
      X = XC + Rayon * Cos(N * #PI / 180)
      Y = YC + Rayon * Sin(N * #PI / 180)
      Tampon=Str(Digit)
      
      DrawingMode(#PB_2DDrawing_Transparent)
      If Digit % 3 <> 0
        DrawText(X-TextWidth(Tampon)/2, Y-TextHeight(Tampon)/2, Tampon, RGB(255, 255, 255))
      ElseIf Digit % 3 = 0
        DrawingFont(FontID(#FontHeureGrasse))
        DrawText(X-TextWidth(Tampon)/2, Y-TextHeight(Tampon)/2, Tampon, RGB(255, 255, 255))
        DrawingFont(FontID(#FontHeure))
      EndIf
      DrawingMode(#PB_2DDrawing_Default)
    Next
    
    ;Les Chiffres des minutes (0 à 59)
    Digit=15
    Rayon = 390
    DrawingFont(FontID(#FontMinute))
    For N = 0 To 359 Step 6
      Digit+1
      If Digit>60
        Digit = 1
      EndIf
      
      X = XC + Rayon * Cos(N * #PI / 180)
      Y = YC + Rayon * Sin(N * #PI / 180)
      Tampon=Str(Digit-1)
      
      DrawingMode(#PB_2DDrawing_Transparent)
      DrawText(X-TextWidth(Tampon)/2, Y-TextHeight(Tampon)/2, Tampon, RGB(255, 255, 255))
      DrawingMode(#PB_2DDrawing_Default)
    Next
    
    StopDrawing()
  EndIf
EndIf

Repeat
  
  PlaySound(#son)
  
  Evenement  = WaitWindowEvent(1000)
  EvenementGadget = EventGadget()
  ClearScreen(RGB(0, 0, 0))
  xsec.s = FormatDate("%ss", Date())
  xmin.s = FormatDate("%ii", Date())
  xheure.s = FormatDate("%hh", Date())
  
  xjour.s = FormatDate("%dd", Date())
  jm = (Val(xjour)-1)*11.613
  
  If Val(xheure) > 11
    xheure = Str(Val(xheure)-12)
  EndIf
  s = Val(xsec) * 6
  m = (Val(xmin) * 60 + Val(xsec)) / 10
  h = (Val(xheure) * 60 + Val(xmin)) / 2
  j = DayOfWeek(Date()) * (360 / 7)
  
  ZoomSprite(#Trotteuse, TailleImage, TailleImage)
  ZoomSprite(#GrandeAiguille, TailleImage, TailleImage)
  ZoomSprite(#PetiteAiguille, TailleImage, TailleImage)
  ZoomSprite(#Spr_Jour_Sem, TailleImage, TailleImage)
  ZoomSprite(#Spr_Jour_Mois, TailleImage, TailleImage)
  ZoomSprite(#Fond, TailleImage, TailleImage)
  
  RotateSprite(#Trotteuse, s, 0)
  RotateSprite(#GrandeAiguille, m, 0)
  RotateSprite(#PetiteAiguille, h, 0)
  RotateSprite(#Spr_Jour_Sem, j, 0)
  RotateSprite(#Spr_Jour_Mois, jm+90, 0)
  
  DisplayTransparentSprite(#Fond, 0, 0, 255)
  DisplayTransparentSprite(#Spr_Jour_Sem, 0, 0, 255)
  DisplayTransparentSprite(#Spr_Jour_Mois, 0, 0, 255)
  DisplayTransparentSprite(#PetiteAiguille, 0, 0, 255)
  DisplayTransparentSprite(#GrandeAiguille, 0, 0, 255)
  DisplayTransparentSprite(#Trotteuse, 0, 0, 255)
  
  FlipBuffers()
  Delay(20)
  Select Evenement
    Case #PB_Event_CloseWindow
      End
  EndSelect
ForEver

DataSection
  Son:
  IncludeBinary #PB_Compiler_FilePath + "\Data\Tic.Wav"
  FinSon:
EndDataSection
Dernière modification par Micoute le ven. 04/mars/2016 12:11, modifié 1 fois.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Comment éviter qu'un événement ne se reproduise intempes

Message par Ar-S »

Je ne vois aucun timer dans ton code..
Pour une horloge c'est un peu balo :)

Tu fais un timer d'une seconde et à chaque seconde tu joues ton son et tu bouges ton aiguille seconde plutôt que de te miner avec un WaitWindowEvent(1000)

Post déjà mis ailleurs quand on faisait nos timers (et mon coucou)
Voilà un decompte sec apres seconde avec un Tic

Je te laisse remettre ton tic.wav que je n'avais pas.

Code : Tout sélectionner

If Not InitSound()
  End
EndIf

UseOGGSoundDecoder() ; a virer si tu mets un wav

CatchSound(10, ?Son, ?SonFin - ?Son) ; c'est bien de préciser la durée comme ici
SoundVolume(10, 30)

Global DureeSec = 10



Procedure TimerEvent()
  DureeSec -1
  SetGadgetText (1,"BOUGE LA FENETRE " + Str(DureeSec))
  PlaySound(10)
  
  If DureeSec <= 0
    SetGadgetText (1,"TERMINE")
    StopSound(10)
  EndIf
EndProcedure



If OpenWindow(0, 0, 0, 220, 121, "Minuteur/ldvmultimedia.com", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ButtonGadget  (1, 1, 60, 218, 30, "BOUGE LA FENETRE ")
  AddWindowTimer(0,3,1000)
  BindEvent(#PB_Event_Timer, @TimerEvent()) ; Le BindEvent te permet de déplacer ta fenêtre tout en maintenant le comptage, (c'est l’intérêt du callback BindEvent)
EndIf

Repeat
  Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
; En bonus on libère les ressources ;)
FreeSound(10)
UnbindEvent(#PB_Event_Timer, @TimerEvent())


; Remet ton fichier à la place du miens
DataSection
  Son:
  IncludeBinary "E:\OneDrive\Documents\PB\_Ressources\tic.ogg"
  SonFin:
EndDataSection
En français ça fait...

Je crée un évènement (3) qui se passera toutes les secondes (1000) sur la fenêtre (0) : AddWindowTimer(0,3,1000)
Des qu'un évènement de temps se produit (BindEvent(#PB_Event_Timer) alors j'execute la procédure ciblée (Procedure TimerEvent())

C'est donc dans cette procédure TimerEvent() qu'il faut gérer ton comptage heure/min/sec

Voilou
~~~~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
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: Comment éviter qu'un événement ne se reproduise intempes

Message par Marc56 »

Ma version « à l'ancienne » (sans BindEvent) que j'éspère didactique.

Code : Tout sélectionner

Enumeration 
    #Windows_0
    #Timer_Seconde
    #Timer_Minute
EndEnumeration


OpenWindow(#Windows_0, 0, 0, 600, 300, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
AddWindowTimer(#Windows_0, #Timer_Seconde,  1000)
AddWindowTimer(#Windows_0, #Timer_Minute,   1000 * 60)


Procedure Faire_Chaque_Seconde()
    Debug "1 seconde. " + FormatDate("%hh:%ii:%ss", Date())
EndProcedure


Procedure Faire_Chaque_Minute()
    Debug "1 minute"
EndProcedure


Repeat   
    Event = WaitWindowEvent()
    Select Event
            
        Case #PB_Event_Timer 
            Select EventTimer()
                    
                Case #Timer_Seconde
                    Faire_Chaque_Seconde()
                    
                Case #Timer_Minute
                    Faire_Chaque_Minute()
                    
            EndSelect
            
        Case #PB_Event_CloseWindow 
            Break
            
    EndSelect   
ForEver

Debug "Sortie normmale."

End
Attention, car "Faire_Chaque_Minute()" ne se produit pas nécessairement à 00 secondes, mais au lancement de la commande. Il faut donc soit caler le démarrage du timer minute (à 00 secondes) soit ne pas s'en servir et 'checker' pour les évènements minutes que les secondes sont à 00 :wink:

PS. Joli travail ta pendule. Je me rappelle en avoir bavé pour en faire une dont les aiguilles partaient dans tous les sens, aavnt de relire calmement la doc et de voir que les Sin et cos sont exprimés par défaut en Radian et non pas en degrés :o
Dernière modification par Marc56 le ven. 04/mars/2016 11:58, modifié 1 fois.
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Comment éviter qu'un événement ne se reproduise intempes

Message par falsam »

@Ar-s et Marc : Il s'agit ici d'un environnement 2D.
Micoute a écrit :d'où ma question comment éviter qu'un événement ne se reproduise intempestivement.
En évitant d'utiliser WaitWindowEvent()

Comme son nom l'indique, WaitWindowEvent() attend un événement. Tu bouges la souris, ça implique un événement. Le son TicTac est joué d'ou ce son horrible.

Dans une application 2D tu utilises WindowEvent() pour libérer et éventuellement traiter la pile d'évenement de ta fenêtre avant de passer aux évenements 2D.

C'est le principe du double event souvent décrié sur ce forum :wink:

Pour ton titac pas besoin de timer. Tu mémorises l'heure que tu compares à l'heure actuel. Si plus de 1000 ms alors tu joues le son.

Le code corrigé.

Code : Tout sélectionner

EnableExplicit

Enumeration
  #Fenetre_principale
EndEnumeration
Enumeration 
  #Trotteuse
  #GrandeAiguille
  #PetiteAiguille
  #Spr_Jour_Sem
  #Spr_Jour_Mois
  #Fond
  #Son
EndEnumeration

Enumeration Font
  #FontHeure
  #FontMinute
  #FontHeureGrasse
EndEnumeration

Define.l Evenement, EvenementGadget

Global StyleFen.i=#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered
Global Image.i
Global XC.i, YC.i, Rayon.i ;Coordonnées et rayon du point central du cercle
Global X.f, Y.f            ;Coordonnées des points sur le cercle 
Global N.i, Nj.f, xsec.s, xmin.s, xheure.s, xjour.s, s, m, h, j, jm, TailleImage = 1000, Texte.s, Jour.s, Digit, Tampon.s

Global PreviousTime, Time 

If InitSprite()
Else
  End
EndIf

If InitSound()
Else
  End
EndIf

OpenWindow(#Fenetre_principale, 0, 0, TailleImage, TailleImage, "Horloge calendrier", StyleFen)
If OpenWindowedScreen(WindowID(#Fenetre_principale), 0, 0, TailleImage, TailleImage, 1, 0, 0)
  
  CatchSound(#son, ?Son)
  SoundVolume(#son, 20)
  
  CreateSprite(#Spr_Jour_Sem, 800, 800)
  CreateSprite(#Spr_Jour_Mois, 800, 800)
  CreateSprite(#Trotteuse, 800, 800)
  CreateSprite(#GrandeAiguille, 800, 800)
  CreateSprite(#PetiteAiguille, 800, 800)
  CreateSprite(#Fond, 800, 800)
  
  LoadFont(#FontHeure, "Arial", 30, #PB_Font_Bold)
  LoadFont(#FontMinute, "Arial", 15)
  LoadFont(#FontHeureGrasse, "Arial", 40, #PB_Font_Bold)
  
  If StartDrawing(SpriteOutput(#Spr_Jour_Sem))
    
    LineXY(398, 400, 398, 265, $23F5C8)
    LineXY(399, 400, 399, 260, $23F5C8)
    LineXY(400, 400, 400, 255, $23F5C8)
    LineXY(401, 400, 401, 260, $23F5C8)
    LineXY(402, 400, 402, 265, $23F5C8)
    
    Circle(400, 400, 15, $23F5C8)
    StopDrawing()
  EndIf
  
  If StartDrawing(SpriteOutput(#Spr_Jour_Mois))
    
    LineXY(398, 400, 398, 225, $23F5C8)
    LineXY(399, 400, 399, 220, $23F5C8)
    LineXY(400, 400, 400, 215, $23F5C8)
    LineXY(401, 400, 401, 210, $23F5C8)
    LineXY(402, 400, 402, 215, $23F5C8)
    
    Circle(400, 400, 15, $23F5C8) ;Centre
    StopDrawing()
  EndIf
  
  If StartDrawing(SpriteOutput(#Trotteuse))
    LineXY(398, 550, 398, 65, $2323C8)
    LineXY(399, 550, 399, 60, $2323C8)
    LineXY(400, 550, 400, 55, $2323C8)
    LineXY(401, 550, 401, 60, $2323C8)
    LineXY(402, 550, 402, 65, $2323C8)
    
    Circle(400, 530, 10, $2323C8) ; la
    Circle(400, 535,  9, $2323C8) ; queue
    Circle(400, 540,  8, $2323C8) ; de
    Circle(400, 545,  7, $2323C8) ; la
    Circle(400, 550,  6, $2323C8) ; trotteuse
    Circle(400, 400, 15, $2323C8) ;le centre de la trotteuse
    
    Circle(400, 400, 25, $2323C8)
    StopDrawing()
  EndIf
  
  If StartDrawing(SpriteOutput(#GrandeAiguille))
    LineXY(390, 400, 390,  20, $FF)
    LineXY(390,  20, 400,  12, $FF) ;\
    LineXY(400,  12, 410,  20, $FF) ;/
    LineXY(410,  20, 410, 400, $FF)
    LineXY(410, 400, 390, 400, $FF)
    FillArea(400, 300, $FF, $FFFFFF)
    Circle(400, 400, 10, $FF)
    StopDrawing()
  EndIf
  
  If StartDrawing(SpriteOutput(#PetiteAiguille))
    LineXY(390, 160, 390, 410, $FF)
    LineXY(390, 160, 400, 145, $FF) ;pointe \
    LineXY(400, 145, 410, 160, $FF) ;pointe /
    LineXY(410, 160, 410, 410, $FF)
    LineXY(390, 410, 410, 410, $FF)
    FillArea(400, 300, $FF, $FFFFFF)
    StopDrawing()
  EndIf
  
  
  If StartDrawing(SpriteOutput(#Fond)) ;- fond
    
    ;Coordonnées et rayon du point central du cercle
    XC = 400
    YC = 400
    
    Circle(XC, YC, 800, $600000) ;Contour
    ;Point central
    Circle(XC, YC, 400, $E13736)
    
    ;Les secondes (0 à 59)
    Rayon = 350
    For N = 0 To 364 Step 6
      X = XC + Rayon * Cos(N * #PI / 180)
      Y = YC + Rayon * Sin(N * #PI / 180)
      Circle(X,Y,3, $97FB98)
    Next
    
    ;Les jours de semaine (lundi à dimanche)
    Rayon = 150
    Circle(XC, YC, 200, $FF0000)
    DrawText(400-TextWidth("Dim")/2, 235, "Dim", $00FFFF, $FF0000)
    DrawText(515, 290, "Lun", $00FFFF, $FF0000)
    DrawText(545, 425, "Mar", $00FFFF, $FF0000)
    DrawText(455, 535, "Mer", $00FFFF, $FF0000)
    DrawText(345-TextWidth("Jeu"), 535, "Jeu", $00FFFF, $FF0000)
    DrawText(255-TextWidth("Ven"), 435, "Ven", $00FFFF, $FF0000)
    DrawText(280-TextWidth("Sam"), 290, "Sam", $00FFFF, $FF0000)     
    
    ;Les Chiffres des jours (1 à 31)
      Digit=0
      Rayon = 190
      Nj.f = 0
      While Nj < 360
        
        Digit+1
        
        X = XC + Rayon * Cos(Nj * #PI / 180)
        Y = YC + Rayon * Sin(Nj * #PI / 180)
        Tampon=Str(Digit)
        
        DrawingMode(#PB_2DDrawing_Transparent)
        DrawText(X-TextWidth(Tampon)/2, Y-TextHeight(Tampon)/2, Tampon, RGB(255, 255, 0))
        DrawingMode(#PB_2DDrawing_Default)
        Nj + 11.613
      Wend
      
    ;Les Chiffres des heures (1 à 12)
    Digit=2
    Rayon = 270
    DrawingFont(FontID(#FontHeure))        
    For N = 0 To 345 Step 30
      Digit+1
      If Digit>12
        Digit = Mod(12,4) + 1
      EndIf
      
      X = XC + Rayon * Cos(N * #PI / 180)
      Y = YC + Rayon * Sin(N * #PI / 180)
      Tampon=Str(Digit)
      
      DrawingMode(#PB_2DDrawing_Transparent)
      If Digit % 3 <> 0
        DrawText(X-TextWidth(Tampon)/2, Y-TextHeight(Tampon)/2, Tampon, RGB(255, 255, 255))
      ElseIf Digit % 3 = 0
        DrawingFont(FontID(#FontHeureGrasse))
        DrawText(X-TextWidth(Tampon)/2, Y-TextHeight(Tampon)/2, Tampon, RGB(255, 255, 255))
        DrawingFont(FontID(#FontHeure))
      EndIf
      DrawingMode(#PB_2DDrawing_Default)
    Next
    
    ;Les Chiffres des minutes (0 à 59)
    Digit=15
    Rayon = 390
    DrawingFont(FontID(#FontMinute))
    For N = 0 To 359 Step 6
      Digit+1
      If Digit>60
        Digit = 1
      EndIf
      
      X = XC + Rayon * Cos(N * #PI / 180)
      Y = YC + Rayon * Sin(N * #PI / 180)
      Tampon=Str(Digit-1)
      
      DrawingMode(#PB_2DDrawing_Transparent)
      DrawText(X-TextWidth(Tampon)/2, Y-TextHeight(Tampon)/2, Tampon, RGB(255, 255, 255))
      DrawingMode(#PB_2DDrawing_Default)
    Next
    
    StopDrawing()
  EndIf
EndIf

Repeat ;Evemement 2D
  
 ; Evenement  = WaitWindowEvent(1000)
 ; EvenementGadget = EventGadget()
  
  ; Libération de la file d'attente de la fenetre
  Repeat 
    Evenement = WindowEvent()
     
    Select Evenement    
      Case #PB_Event_CloseWindow
        End
    EndSelect  
  Until Evenement=0 
  
  ;Deroulement 2D
  ClearScreen(RGB(0, 0, 0))
  xsec.s = FormatDate("%ss", Date())
  xmin.s = FormatDate("%ii", Date())
  xheure.s = FormatDate("%hh", Date())
  
  xjour.s = FormatDate("%dd", Date())
  jm = (Val(xjour)-1)*11.613
  
  If Val(xheure) > 11
    xheure = Str(Val(xheure)-12)
  EndIf
  
  s = Val(xsec) * 6
  m = (Val(xmin) * 60 + Val(xsec)) / 10
  h = (Val(xheure) * 60 + Val(xmin)) / 2
  j = DayOfWeek(Date()) * (360 / 7)
  
  ZoomSprite(#Trotteuse, TailleImage, TailleImage)
  ZoomSprite(#GrandeAiguille, TailleImage, TailleImage)
  ZoomSprite(#PetiteAiguille, TailleImage, TailleImage)
  ZoomSprite(#Spr_Jour_Sem, TailleImage, TailleImage)
  ZoomSprite(#Spr_Jour_Mois, TailleImage, TailleImage)
  ZoomSprite(#Fond, TailleImage, TailleImage)
  
  RotateSprite(#Trotteuse, s, 0)
  RotateSprite(#GrandeAiguille, m, 0)
  RotateSprite(#PetiteAiguille, h, 0)
  RotateSprite(#Spr_Jour_Sem, j, 0)
  RotateSprite(#Spr_Jour_Mois, jm+90, 0)
  
  DisplayTransparentSprite(#Fond, 0, 0, 255)
  DisplayTransparentSprite(#Spr_Jour_Sem, 0, 0, 255)
  DisplayTransparentSprite(#Spr_Jour_Mois, 0, 0, 255)
  DisplayTransparentSprite(#PetiteAiguille, 0, 0, 255)
  DisplayTransparentSprite(#GrandeAiguille, 0, 0, 255)
  DisplayTransparentSprite(#Trotteuse, 0, 0, 255)
  
  
  Time = ElapsedMilliseconds()
  If Time - PreviousTime > 1000
    PreviousTime = Time
    PlaySound(#son)
  EndIf
  
  
  FlipBuffers()
  
  ;Delay(20)
  
  ;Select Evenement
  ;  Case #PB_Event_CloseWindow
  ;    End
  ;EndSelect
ForEver

DataSection
  Son:
  IncludeBinary "TicTac.Wav"
  FinSon:
EndDataSection
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%
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Comment éviter qu'un événement ne se reproduise intempes

Message par Micoute »

Merci à tous,

vos solutions me plaisent beaucoup, mais je préfère celle de falsam.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Comment éviter qu'un événement ne se reproduise intempes

Message par falsam »

Maintenant que le souci du compteur Geiger est résolu tu peux faire une petite amélioration

- Quitter l'horloge avec la touche Escape. Pour cela :

■ Remplace

Code : Tout sélectionner

If InitSprite()
Else
  End
EndIf

If InitSound()
Else
  End
EndIf
par

Code : Tout sélectionner

If Not (InitSprite() And InitSound() And InitKeyboard()) 
  End
EndIf
■ Insére juste avant FlipBuffers()

Code : Tout sélectionner

If ExamineKeyboard()
    If KeyboardReleased(#PB_Key_Escape)
      End
    EndIf
  EndIf
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%
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: [Rés] Comment éviter qu'un événement ne se reproduise in

Message par falsam »

Je n'avais pas vu ta variable s qui calcule le mouvement de ta trotteuse.

Remplace

Code : Tout sélectionner

  Time = ElapsedMilliseconds()
  If Time - PreviousTime > 1000
    PreviousTime = Time
    PlaySound(#son)
  EndIf
par

Code : Tout sélectionner

 Time = s
     
  If Time - PreviousTime > 0 Or Time - PreviousTime < 0
    PreviousTime = s
    PlaySound(#son)
  EndIf
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%
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: [Rés] Comment éviter qu'un événement ne se reproduise in

Message par Ar-S »

J'ai relevé 2 soucis
- Lorsque ton aiguille revient sur 0 le son ne fonctionne plus...
- Lorsque l'on bouge la fenêtre, tout se freeze.
~~~~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
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: [Rés] Comment éviter qu'un événement ne se reproduise in

Message par falsam »

Ar-S a écrit :Lorsque ton aiguille revient sur 0 le son ne fonctionne plus...
Code précédent corrigé. Merci Ar-s
Ar-S a écrit :Lorsque l'on bouge la fenêtre, tout se freeze.
Ca freeze le temps du déplacement car la pile d’événements de la fenêtre revient à zero seulement quand tu relâches la souris.
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%
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: [Rés] Comment éviter qu'un événement ne se reproduise in

Message par Ar-S »

pour rendre l'horloge (beaucoup) plus jolie, ajoutez SpriteQuality(#PB_Sprite_BilinearFiltering) dans la création des sprites. J'ai testé, ça change quand même vraiment le résultat.
~~~~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
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: [Rés] Comment éviter qu'un événement ne se reproduise in

Message par Micoute »

Merci encore à tous, finalement, j'ai bien raison de passer plusieurs fois par jours, car mon horloge ressemble beaucoup à ce que j'en attendais au début et en plus les tics sont synchronisés avec la trotteuse.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: [Rés] Comment éviter qu'un événement ne se reproduise in

Message par Marc56 »

Ar-S a écrit :pour rendre l'horloge (beaucoup) plus jolie, ajoutez SpriteQuality(#PB_Sprite_BilinearFiltering) dans la création des sprites. J'ai testé, ça change quand même vraiment le résultat.
Extraordinaire 8O tout est lissé :P
Je l'ai mis juste après OpenWindowedScreen()

Il faudra un jour que je me mette au graphisme, c'est un domaine que je n'ai encore jamais exploré en PB :)
(La dernière fois que j'ai fais un sprite c'était sur mon Commodore 128, il y a euh, houla... années 80'
Et dire que je l'ai mis au recyclage il y a à peine 2 ans, quel idiot je suis :?

Il y a un truc dans cette horloge, c'est que dépendant du moment où on la lance, le "Tic" se produit avant ou après le déplacement de l'aiguille.
Mais ça vient peut-être du son que j'ai utilisé ? ou alors le son n'est-il pas joué en arrière-plan, donc sa durée influe ? J'ai l'impression qu'il se décale au bout d'une ou deux minute ?

PS. Ce serait une bonne idée d'héberger quelque part une banque de petits fichiers génériques (icônes, sons etc) que chacun pourrait intégrer chaque fois qu'il y a un exemple à donner, pour qu'on ait tous la même base d'étude ? (bip, tictac coucou etc). En utilisant des fichiers sélectionnés libres de droits. Après il suffit dans les exemples de faire un lien http comme cela était fait dans quelques exemples proposés sur ce forum.

Il faudrait un endroit assez pérenne pour que les exemples restent valable plusieurs années.

:wink:
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: [Rés] Comment éviter qu'un événement ne se reproduise in

Message par Ar-S »

Oui, pour de petits fichiers, il serait même pratique de les mettre en Data.q via datasection, ainsi ils pourraient être stockés sur un topic dédié :wink:
~~~~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
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: [Rés] Comment éviter qu'un événement ne se reproduise in

Message par Micoute »

Ce qui pourrait faire la force de ce forum, c'est que chacun mette sa "spécialité" au profit de tous les autres, certains sont bons en graphismes, d'autres en maths, en gestions d'événements, etc...

Je pense même qu'il pourrait y avoir des cours de programmation pour tous les niveaux.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Répondre