Page 1 sur 1

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

Publié : ven. 04/mars/2016 11:14
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

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

Publié : ven. 04/mars/2016 11:24
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

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

Publié : ven. 04/mars/2016 11:51
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

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

Publié : ven. 04/mars/2016 11:56
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

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

Publié : ven. 04/mars/2016 12:10
par Micoute
Merci à tous,

vos solutions me plaisent beaucoup, mais je préfère celle de falsam.

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

Publié : ven. 04/mars/2016 12:15
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

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

Publié : ven. 04/mars/2016 12:24
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

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

Publié : ven. 04/mars/2016 12:43
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.

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

Publié : ven. 04/mars/2016 12:46
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.

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

Publié : ven. 04/mars/2016 12:47
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.

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

Publié : ven. 04/mars/2016 14:06
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.

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

Publié : ven. 04/mars/2016 14:27
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:

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

Publié : ven. 04/mars/2016 14:46
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:

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

Publié : ven. 04/mars/2016 15:48
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.