Horloge 4 cadrans

Programmation d'applications complexes
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Horloge 4 cadrans

Message par Micoute »

Bonjour à tous, comme promis, je poste un programme que j'avais déjà fais, mais que j'ai repris pour l'améliorer, toutes les aiguilles dans le même centre, je ne trouvais pas trop joli, j'ai commenté les lignes ayant trait au son, car chez moi, elle fait tic-tac, parce que je n'ai pas joint le fichier .wav.

Vous avez du remarqué que je fais souvent des calendriers et des horloges, mais c'est parce le temps qui passe, ça me passionne.

Code : Tout sélectionner

EnableExplicit

Enumeration
  #Fenetre_principale
EndEnumeration

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

Enumeration Font
  #FontHeure
  #FontMinute
  #FontHeureGrasse
EndEnumeration

Define.l Evenement, EvenementGadget

Global StyleFen.i=#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered
Global Image.i
Global XC, YC, XCJ, YCJ, XCD, YCD, XCH, YCH, Rayon ;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 , h24

;Global PreviousTime, Time 


;Coordonnées et rayon du point central du cercle
XC  = 400:YC  = 400
XCJ = 200:YCJ = 300 ;jours semaine
XCD = 600:YCD = 300 ;jours mois
XCH = 400:YCH = 600 ;cadran 24 heures

If Not (InitSprite() And InitSound() And InitKeyboard()) 
  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, 10)
  
  CreateSprite(#Spr_Jour_Sem, 800, 800, SpriteQuality(#PB_Sprite_BilinearFiltering))
  CreateSprite(#Spr_Jour_Mois, 800, 800, SpriteQuality(#PB_Sprite_BilinearFiltering))
  CreateSprite(#Spr_H24, 800, 800, SpriteQuality(#PB_Sprite_BilinearFiltering))
  CreateSprite(#Trotteuse, 800, 800, SpriteQuality(#PB_Sprite_BilinearFiltering))
  CreateSprite(#GrandeAiguille, 800, 800, SpriteQuality(#PB_Sprite_BilinearFiltering))
  CreateSprite(#PetiteAiguille, 800, 800, SpriteQuality(#PB_Sprite_BilinearFiltering))
  CreateSprite(#Fond, 800, 800, SpriteQuality(#PB_Sprite_BilinearFiltering))
  
  LoadFont(#FontHeure, "Arial", 30, #PB_Font_Bold)
  LoadFont(#FontMinute, "Arial", 15)
  LoadFont(#FontHeureGrasse, "Arial", 40, #PB_Font_Bold)
  
  If StartDrawing(SpriteOutput(#Spr_Jour_Sem)) ;-sprite des jours de semaine
    
    LineXY(398, 400, 398, 305, $353535)
    LineXY(399, 400, 399, 300, $353535)
    LineXY(400, 400, 400, 295, $353535)
    LineXY(401, 400, 401, 300, $353535)
    LineXY(402, 400, 402, 305, $353535)
    
    Circle(400, 400, 15, $353535)
    StopDrawing()
    
  EndIf
  
  If StartDrawing(SpriteOutput(#Spr_Jour_Mois)) ;-sprite des jours du mois
    
    LineXY(398, 400, 398, 305, $353535)
    LineXY(399, 400, 399, 300, $353535)
    LineXY(400, 400, 400, 295, $353535)
    LineXY(401, 400, 401, 300, $353535)
    LineXY(402, 400, 402, 305, $353535)
    
    Circle(400, 400, 15, $353535) ;Centre
    
    StopDrawing()
  EndIf
  
  If StartDrawing(SpriteOutput(#Spr_H24)) ;-sprite du cadran 24 heures
    
    LineXY(398, 400, 398, 305, $353535)
    LineXY(399, 400, 399, 300, $353535)
    LineXY(400, 400, 400, 295, $353535)
    LineXY(401, 400, 401, 300, $353535)
    LineXY(402, 400, 402, 305, $353535)
    
    Circle(400, 400, 15, $353535)
    
    StopDrawing()
  EndIf  
  
  If StartDrawing(SpriteOutput(#Trotteuse)) ;-sprite de la 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)) ;-sprite de la grande aiguille
    LineXY(390, 400, 390,  20, $1)
    LineXY(390,  20, 400,  12, $1) ;\
    LineXY(400,  12, 410,  20, $1) ;/
    LineXY(410,  20, 410, 400, $1)
    LineXY(410, 400, 390, 400, $1)
    FillArea(400, 300, $1, $1)
    Circle(400, 400, 10, $1)
    StopDrawing()
  EndIf
  
  If StartDrawing(SpriteOutput(#PetiteAiguille)) ;-sprite petite aiguille
    
    LineXY(390, 160, 390, 410, $1)
    LineXY(390, 160, 400, 145, $1) ;pointe \
    LineXY(400, 145, 410, 160, $1) ;pointe /
    LineXY(410, 160, 410, 410, $1)
    LineXY(390, 410, 410, 410, $1)
    FillArea(400, 300, $1, $1)
    StopDrawing()
  EndIf
  
  
  If StartDrawing(SpriteOutput(#Fond)) ;- fond
    
    Circle(400, 400, 800, $404040) ;Couleur de fond de l'image
                                   ;Point central
    Circle(400, 400, 400, $AA4E30) ;contour horloge
    
    
    Circle(XCH, YCH, 110, $80DD80) ;cadran 24 heures
    
    ;-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)
    Circle(XCJ, YCJ, 110, $80DD80) ;contour semainier
    DrawText(390-XCJ,290-100, "Dim",255, $80DD80)
    DrawRotatedText(475-XCJ,320-100, "Lun",311,1)
    DrawRotatedText(485-XCJ,430-100, "Mar",87,1)
    DrawRotatedText(425-XCJ,485-100, "Mer",25,1)
    DrawRotatedText(350-XCJ,475-100, "Jeu",335,1)
    DrawRotatedText(310-XCJ,407-100, "Ven",290,1)
    DrawRotatedText(300-XCJ,350-100, "Sam",60,1)
    
    ;-Les Chiffres des jours (1 à 31)
    
    Circle(XCD, YCD, 110, $80DD80)
    
    Digit=0
    Rayon = 100
    Nj.f = 0
    While Nj < 360
      
      Digit+1
      
      X = XCD + Rayon * Cos(Nj * #PI / 180)
      Y = YCD + Rayon * Sin(Nj * #PI / 180)
      Tampon=Str(Digit)
      
      DrawingMode(#PB_2DDrawing_Transparent)
      DrawText(X-TextWidth(Tampon)/2, Y-TextHeight(Tampon)/2, Tampon, $1)
      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 du petit cadran (1 à 24)
    Digit=5
    Rayon = 100
    DrawingFont(FontID(#FontMinute))        
    For N = 0 To 360 Step 15
      Digit+1
      If Digit>23
        Digit = 0
      EndIf
      
      X = XCH + Rayon * Cos(N * #PI / 180)
      Y = YCH + Rayon * Sin(N * #PI / 180)
      Tampon=Str(Digit)
      
      DrawingMode(#PB_2DDrawing_Transparent)
      DrawText(X-TextWidth(Tampon)/2, Y-TextHeight(Tampon)/2, Tampon, 0)
      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
  
  ; 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)
  h24 = (Val(xheure) * 60 + Val(xmin)) / 4 ; système 24 h
  
  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, #PB_Absolute)
  RotateSprite(#GrandeAiguille, m, #PB_Absolute)
  RotateSprite(#PetiteAiguille, h, #PB_Absolute)
  RotateSprite(#Spr_Jour_Sem, j, #PB_Absolute)
  RotateSprite(#Spr_Jour_Mois, jm+90, #PB_Absolute)
  Select Hour(Date())
      Case  0 To 11
    RotateSprite(#Spr_H24, h24, #PB_Absolute)
  Case 12 To 23
    RotateSprite(#Spr_H24, h24-180, #PB_Absolute)
  EndSelect  
  Debug Hour(Date())
  
  DisplayTransparentSprite(#Fond, 0, 0, 255)
  DisplayTransparentSprite(#Spr_Jour_Sem, -250, -120, 255)
  DisplayTransparentSprite(#Spr_Jour_Mois, 250, -125, 255)
  DisplayTransparentSprite(#Spr_H24, 100, 350, 255)
  DisplayTransparentSprite(#PetiteAiguille, 0, 0, 255)
  DisplayTransparentSprite(#GrandeAiguille, 0, 0, 255)
  DisplayTransparentSprite(#Trotteuse, 0, 0, 255)
  
  
;  Time = s
  
;  If Time - PreviousTime > 0 Or Time - PreviousTime < 0
;    PreviousTime = s
;    PlaySound(#son)
;  EndIf
  
  If ExamineKeyboard()
    If KeyboardReleased(#PB_Key_Escape)
      End
    EndIf
  EndIf
  
  FlipBuffers()
ForEver

;DataSection
;  Son:
;  IncludeBinary #PB_Compiler_FilePath + "\Data\Tic.Wav"
;  FinSon:
;EndDataSection
; IDE Options = PureBasic 5.50 beta 2 (Windows - x86)
; EnableThread
; EnableXP
; UseIcon = ..\..\Gfx\icones\Chrono.ico
; Executable = ..\..\..\Compil\Horloge Calendrier complete.exe
; EnableUnicode
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 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Ar-S
Messages : 9478
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Horloge 4 cadrans

Message par Ar-S »

Super que tu reprennes les codes :P
J'ai fait une petite modif' perso ou j'ai réuni les sec et les cercles. J'ai aussi écarté les chiffres heures pour ne pas trop qu'ils chevauchent les autres cadrans.

Code : Tout sélectionner

EnableExplicit

Enumeration
  #Fenetre_principale
EndEnumeration

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

Enumeration Font
  #FontHeure
  #FontMinute
  #FontHeureGrasse
EndEnumeration

Define.l Evenement, EvenementGadget

Global StyleFen.i=#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered
Global Image.i
Global XC, YC, XCJ, YCJ, XCD, YCD, XCH, YCH, Rayon ;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 , h24

;Global PreviousTime, Time


;Coordonnées et rayon du point central du cercle
XC  = 400:YC  = 400
XCJ = 200:YCJ = 300 ;jours semaine
XCD = 600:YCD = 300 ;jours mois
XCH = 400:YCH = 600 ;cadran 24 heures

If Not (InitSprite() And InitSound() And InitKeyboard())
  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, 10)
 
  CreateSprite(#Spr_Jour_Sem, 800, 800, SpriteQuality(#PB_Sprite_BilinearFiltering))
  CreateSprite(#Spr_Jour_Mois, 800, 800, SpriteQuality(#PB_Sprite_BilinearFiltering))
  CreateSprite(#Spr_H24, 800, 800, SpriteQuality(#PB_Sprite_BilinearFiltering))
  CreateSprite(#Trotteuse, 800, 800, SpriteQuality(#PB_Sprite_BilinearFiltering))
  CreateSprite(#GrandeAiguille, 800, 800, SpriteQuality(#PB_Sprite_BilinearFiltering))
  CreateSprite(#PetiteAiguille, 800, 800, SpriteQuality(#PB_Sprite_BilinearFiltering))
  CreateSprite(#Fond, 800, 800, SpriteQuality(#PB_Sprite_BilinearFiltering))
 
  LoadFont(#FontHeure, "Arial", 25, #PB_Font_Bold)
  LoadFont(#FontMinute, "Arial", 10)
  LoadFont(#FontHeureGrasse, "Arial", 40, #PB_Font_Bold)
 
  If StartDrawing(SpriteOutput(#Spr_Jour_Sem)) ;-sprite des jours de semaine
   
    LineXY(398, 400, 398, 305, $353535)
    LineXY(399, 400, 399, 300, $353535)
    LineXY(400, 400, 400, 295, $353535)
    LineXY(401, 400, 401, 300, $353535)
    LineXY(402, 400, 402, 305, $353535)
   
    Circle(400, 400, 15, $353535)
    StopDrawing()
   
  EndIf
 
  If StartDrawing(SpriteOutput(#Spr_Jour_Mois)) ;-sprite des jours du mois
   
    LineXY(398, 400, 398, 305, $353535)
    LineXY(399, 400, 399, 300, $353535)
    LineXY(400, 400, 400, 295, $353535)
    LineXY(401, 400, 401, 300, $353535)
    LineXY(402, 400, 402, 305, $353535)
   
    Circle(400, 400, 15, $353535) ;Centre
   
    StopDrawing()
  EndIf
 
  If StartDrawing(SpriteOutput(#Spr_H24)) ;-sprite du cadran 24 heures
   
    LineXY(398, 400, 398, 305, $353535)
    LineXY(399, 400, 399, 300, $353535)
    LineXY(400, 400, 400, 295, $353535)
    LineXY(401, 400, 401, 300, $353535)
    LineXY(402, 400, 402, 305, $353535)
   
    Circle(400, 400, 15, $353535)
   
    StopDrawing()
  EndIf 
 
  If StartDrawing(SpriteOutput(#Trotteuse)) ;-sprite de la 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, $1313b8) ;le centre de la trotteuse
   
    Circle(400, 400, 25, $2323C8)
    StopDrawing()
  EndIf
 
  If StartDrawing(SpriteOutput(#GrandeAiguille)) ;-sprite de la grande aiguille
    LineXY(390, 400, 390,  20, $1)
    LineXY(390,  20, 400,  12, $1) ;\
    LineXY(400,  12, 410,  20, $1) ;/
    LineXY(410,  20, 410, 400, $1)
    LineXY(410, 400, 390, 400, $1)
    FillArea(400, 300, $1, $1)
    Circle(400, 400, 10, $1)
    StopDrawing()
  EndIf
 
  If StartDrawing(SpriteOutput(#PetiteAiguille)) ;-sprite petite aiguille
   
    LineXY(390, 160, 390, 410, $1)
    LineXY(390, 160, 400, 145, $1) ;pointe \
    LineXY(400, 145, 410, 160, $1) ;pointe /
    LineXY(410, 160, 410, 410, $1)
    LineXY(390, 410, 410, 410, $1)
    FillArea(400, 300, $1, $1)
    StopDrawing()
  EndIf
 
 
  If StartDrawing(SpriteOutput(#Fond)) ;- fond
   
    Circle(400, 400, 800, $404040) ;Couleur de fond de l'image
                                   ;Point central
    Circle(400, 400, 400, $AA4E30) ;contour horloge
   
   
    Circle(XCH, YCH, 110, $80DD80) ;cadran 24 heures
   
    ;-Les secondes (0 à 59)
    Rayon = 390
    For N = 0 To 364 Step 6
      X = XC + Rayon * Cos(N * #PI / 180)
      Y = YC + Rayon * Sin(N * #PI / 180)
      Circle(X,Y,10, $97FB98)
    Next
   
    ;-Les jours de semaine (lundi à dimanche)
    Circle(XCJ, YCJ, 110, $80DD80) ;contour semainier
    DrawText(390-XCJ,290-100, "Dim",255, $80DD80)
    DrawRotatedText(475-XCJ,320-100, "Lun",311,1)
    DrawRotatedText(485-XCJ,430-100, "Mar",87,1)
    DrawRotatedText(425-XCJ,485-100, "Mer",25,1)
    DrawRotatedText(350-XCJ,475-100, "Jeu",335,1)
    DrawRotatedText(310-XCJ,407-100, "Ven",290,1)
    DrawRotatedText(300-XCJ,350-100, "Sam",60,1)
   
    ;-Les Chiffres des jours (1 à 31)
   
    Circle(XCD, YCD, 110, $80DD80)
   
    Digit=0
    Rayon = 100
    Nj.f = 0
    While Nj < 360
     
      Digit+1
     
      X = XCD + Rayon * Cos(Nj * #PI / 180)
      Y = YCD + Rayon * Sin(Nj * #PI / 180)
      Tampon=Str(Digit)
     
      DrawingMode(#PB_2DDrawing_Transparent)
      DrawText(X-TextWidth(Tampon)/2, Y-TextHeight(Tampon)/2, Tampon, $1)
      DrawingMode(#PB_2DDrawing_Default)
      Nj + 11.613
    Wend
   
    ;-Les Chiffres des heures (1 à 12)
    Digit=2
    Rayon = 350
    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 du petit cadran (1 à 24)
    Digit=5
    Rayon = 100
    DrawingFont(FontID(#FontMinute))       
    For N = 0 To 360 Step 15
      Digit+1
      If Digit>23
        Digit = 0
      EndIf
     
      X = XCH + Rayon * Cos(N * #PI / 180)
      Y = YCH + Rayon * Sin(N * #PI / 180)
      Tampon=Str(Digit)
     
      DrawingMode(#PB_2DDrawing_Transparent)
      DrawText(X-TextWidth(Tampon)/2, Y-TextHeight(Tampon)/2, Tampon, $0)
      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, $0);RGB(255, 255, 255))
      DrawingMode(#PB_2DDrawing_Default)
    Next
   
    StopDrawing()
  EndIf
EndIf

Repeat ;Evemement 2D
 
  ; 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)
  h24 = (Val(xheure) * 60 + Val(xmin)) / 4 ; système 24 h
 
  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, #PB_Absolute)
  RotateSprite(#GrandeAiguille, m, #PB_Absolute)
  RotateSprite(#PetiteAiguille, h, #PB_Absolute)
  RotateSprite(#Spr_Jour_Sem, j, #PB_Absolute)
  RotateSprite(#Spr_Jour_Mois, jm+90, #PB_Absolute)
  Select Hour(Date())
      Case  0 To 11
    RotateSprite(#Spr_H24, h24, #PB_Absolute)
  Case 12 To 23
    RotateSprite(#Spr_H24, h24-180, #PB_Absolute)
  EndSelect 
  Debug Hour(Date())
 
  DisplayTransparentSprite(#Fond, 0, 0, 255)
  DisplayTransparentSprite(#Spr_Jour_Sem, -250, -120, 255)
  DisplayTransparentSprite(#Spr_Jour_Mois, 250, -125, 255)
  DisplayTransparentSprite(#Spr_H24, 100, 350, 255)
  DisplayTransparentSprite(#PetiteAiguille, 0, 0, 255)
  DisplayTransparentSprite(#GrandeAiguille, 0, 0, 255)
  DisplayTransparentSprite(#Trotteuse, 0, 0, 255)
 
 
;  Time = s
 
;  If Time - PreviousTime > 0 Or Time - PreviousTime < 0
;    PreviousTime = s
;    PlaySound(#son)
;  EndIf
 
  If ExamineKeyboard()
    If KeyboardReleased(#PB_Key_Escape)
      End
    EndIf
  EndIf
 
  FlipBuffers()
ForEver
~~~~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 : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Horloge 4 cadrans

Message par Micoute »

Super look, j'adore !

Merci pour l'initiative.
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 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
JohnJohnsonSHERMAN
Messages : 648
Inscription : dim. 13/déc./2015 11:05
Localisation : Allez, cherche...
Contact :

Re: Horloge 4 cadrans

Message par JohnJohnsonSHERMAN »

Micoute is back !
Super ce p'tit code, micoute... Je me cherchais justement une horloge de bureau suite a la fin des gadgets windows avec Windows 8 et 10, et bien je l'ai trouvée ! Nan... elle est un peu grosse pour rester sur mon bureau, mais j'adore le concept, avec les 3 petits cadrans, c'est bien pensé et joliment fait en plus, tout en 2d Drawing !! Merci de ce code , Micoute

Par contre niveau processeur... ca bouffe ! Surtout sur un vieux Dell des années 2002 avec XP dessus... Donc j'ai rajouté ligne 270 un Delay(50), qui laisse fonctionner l'horloge, mais qui libére aussi 50% de mon vieux proco d'un coup ;). Sinon on pourrait aussi mettre un WaitWindowEvent(50) a la place du WindowEvent(), puisque WaitWindowEvent() est bloquant jusqu'a ce qu'un événement se passe, ou que le timer se finisse, ca remplacerait le Delay(50).

Ca donnc ca :

Code : Tout sélectionner

Repeat ;Evemement 2D

  ; Libération de la file d'attente de la fenetre
  Repeat
    Evenement = WaitWindowEvent(50)
   
    Select Evenement   
      Case #PB_Event_CloseWindow
        End
    EndSelect
  Until Evenement=0
  
 ; Delay(50)
  
J'ai juste repris le début de la boucle evenementielle pour ne pas tout remettre.
Avec WaitWindowEvent(50) ca fonctionne aussi bien, avec moins de charge au niveau du matériel (proco + ventilo qui se met a turbiner comme un réacteur d'avion :mrgreen: =

En tout cas merci pour ce code Micoute !
"Le bug se situe entre la chaise et le clavier"
Votre expert national en bogage et segfaults.

CPU : AMD A8 Quad core - RAM 8Gb - HDD 2To
  • Windows 10 x64 - PB 5.61 x64
  • Linux Ubuntu 16.04 LTS x64 (dual boot) - PB pas encore réinstallé
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Horloge 4 cadrans

Message par Zorro »

heu ... excusez moi mais , faudrai m'expliquer un truc !! ??

Code : Tout sélectionner

CreateSprite(#Spr_Jour_Sem, 800, 800, SpriteQuality(#PB_Sprite_BilinearFiltering))
je lis la doc , et il est dit :
#Sprite Le numéro d'identifiant du nouveau sprite.

#PB_Any peut être utilisé pour générer automatiquement ce numéro.
Largeur, Hauteur Les dimensions du nouveau sprite, en pixels.

Mode (optionnel) Peut être une combinaison de (utiliser '|')
#PB_Sprite_PixelCollision: Ajoute des informations spéciales pour gérer les collisions de pixels à travers SpritePixelCollision().
#PB_Sprite_AlphaBlending : Le sprite est créé avec un canal alpha (transparence), nécessaire pour utiliser DisplayTransparentSprite()


chez moi le parametre :

Code : Tout sélectionner

SpriteQuality(#PB_Sprite_BilinearFiltering)
posé en Mode ne fonctionne pas !!
(et je pense que c'est normal )
puisque le parametre attentdu est soit :
#PB_Sprite_PixelCollision
soit
#PB_Sprite_AlphaBlending

donc le code plante chez moi !! ?? (Pb 5.42 ou Pb 5.50 beta1)
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Ar-S
Messages : 9478
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Horloge 4 cadrans

Message par Ar-S »

Effectivement c'est une coquille

Micoute, c'est dans cet ordre que tu dois l'appliquer :

Code : Tout sélectionner

 If StartDrawing(SpriteOutput(#Fond)) ;- fond
SpriteQuality(#PB_Sprite_BilinearFiltering)

(... la suite ...)

StopDrawing()
~~~~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 : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Horloge 4 cadrans

Message par Micoute »

Ok, merci et pendant que je suis là, j'aimerais savoir si on peut dessiner un sprite sur un autre sprite, car je souhaiterais que chaque cadran avec ses caractères serve de base pour y fixer l'aiguille.
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 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Ar-S
Messages : 9478
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Horloge 4 cadrans

Message par Ar-S »

Bien sur, il faut juste ensuite les afficher dans le bon ordre (ton aiguille après ton cadran)
Tu peux même les faire bouger ^^

Code : Tout sélectionner


Enumeration
  #Fenetre_principale
EndEnumeration

Enumeration
  #S1
  #S2
EndEnumeration

Define.l Evenement, EvenementGadget

Global StyleFen.i=#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered

If Not (InitSprite() And InitSound() And InitKeyboard())
  End
EndIf

OpenWindow(#Fenetre_principale, 0, 0, 200, 200, "Horloge calendrier", StyleFen)

If OpenWindowedScreen(WindowID(#Fenetre_principale), 0, 0, 200, 200, 1, 0, 0)
  
  ; Création de 2 sprites vides
  CreateSprite (#S1,100,100)
  CreateSprite (#S2,50,50)
  
  StartDrawing(SpriteOutput(#S1))
    Box(0,0,100,100,$00CCFF) ; Carré orange
  StopDrawing()
  
  StartDrawing(SpriteOutput(#S2))
    Box(0,0,100,100,$0000FF) ; Carré rouge
  StopDrawing()
  
  

EndIf

x = 50


Repeat ;Evemement 2D
 
  ; Libération de la file d'attente de la fenetre
  Repeat
    Evenement = WindowEvent()
   
    Select Evenement   
      Case #PB_Event_CloseWindow
        End
    EndSelect 
  Until Evenement=0
 
  ClearScreen(RGB(0, 0, 0))
  
  DisplaySprite(#S1,50,50)
  
  If X >= 100
    Dir = -1
  ElseIf X <= 50 
    Dir = 1
  EndIf
  X+DIR
  DisplaySprite(#S2,X,50)

 
  FlipBuffers()
ForEver

~~~~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
JohnJohnsonSHERMAN
Messages : 648
Inscription : dim. 13/déc./2015 11:05
Localisation : Allez, cherche...
Contact :

Re: Horloge 4 cadrans

Message par JohnJohnsonSHERMAN »

C'est bizarre, je n'ai pas eu d'erreur avec le premier code, cad celui de Micoute, puis avec la version de Ar-S... Qui sait, mon ordi corrige peut-être tout seul ? :mrgreen: :mrgreen:
"Le bug se situe entre la chaise et le clavier"
Votre expert national en bogage et segfaults.

CPU : AMD A8 Quad core - RAM 8Gb - HDD 2To
  • Windows 10 x64 - PB 5.61 x64
  • Linux Ubuntu 16.04 LTS x64 (dual boot) - PB pas encore réinstallé
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Horloge 4 cadrans

Message par Zorro »

JohnJohnsonSHERMAN a écrit :C'est bizarre, je n'ai pas eu d'erreur avec le premier code, cad celui de Micoute, puis avec la version de Ar-S... Qui sait, mon ordi corrige peut-être tout seul ? :mrgreen: :mrgreen:

c'est surement parce que tu lances les codes, sans le debugger actif ! ;)
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

Re: Horloge 4 cadrans

Message par Shadow »

Whaaaa pas mal :o
Jolie tous ça, l'amélioration de Ar-s est très bien aussi !
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Bernie
Messages : 282
Inscription : mar. 22/mars/2016 10:12
Localisation : En France

Re: Horloge 4 cadrans

Message par Bernie »

c'est pas mal
Avatar de l’utilisateur
JohnJohnsonSHERMAN
Messages : 648
Inscription : dim. 13/déc./2015 11:05
Localisation : Allez, cherche...
Contact :

Re: Horloge 4 cadrans

Message par JohnJohnsonSHERMAN »

Debugger actif :

Code : Tout sélectionner

InitSprite()
OpenWindow(0,0,0,1000,1000,"Test")
OpenWindowedScreen(WindowID(0),10,10,800,800)
CreateSprite(1,10,10,SpriteQuality(#PB_Sprite_BilinearFiltering))
StartDrawing(SpriteOutput(1))
Box(0,0,10,10,$FF0000)
StopDrawing()

Repeat
  event = WaitWindowEvent()
  ClearScreen($000000)
  DisplaySprite(1,50,50)
  FlipBuffers()
Until event = #PB_Event_CloseWindow
Ca ne provoque chez moi aucune erreur, ce qui est tout a fait normal en fait, puisque SpriteQuality() ne renvoie aucune valeur, comme spécifié dans la doc :
SpriteQuality()

Syntaxe

SpriteQuality(Qualite)

Description

Change la qualité de rendu d'un sprite.

Arguments

Qualite La qualité d'affichage du sprite.
Peut-être l'une des valeurs suivantes:

#PB_Sprite_NoFiltering : Pas de filtrage, plus rapide, mais laid après un zoom / rotation (par défaut).
#PB_Sprite_BilinearFiltering: Filtrage bilinéaire, plus lent mais propre lors de zoom / rotation.

Valeur de retour

Aucune.
C'est comme si Micoute n'avais rien précisé dans le paramétre Mode de CreateSprite()

Et j'utilise toujours mon debugger, Zorro :P
"Le bug se situe entre la chaise et le clavier"
Votre expert national en bogage et segfaults.

CPU : AMD A8 Quad core - RAM 8Gb - HDD 2To
  • Windows 10 x64 - PB 5.61 x64
  • Linux Ubuntu 16.04 LTS x64 (dual boot) - PB pas encore réinstallé
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Horloge 4 cadrans

Message par Zorro »

JohnJohnsonSHERMAN a écrit :Et j'utilise toujours mon debugger, Zorro :P

ben j'en suis pas sur !!

regarde cette video qui demontre que le bug est bien signalé par le debugger ! (CQFD)
code de Micoute

https://youtu.be/HosAYYtJd4w


et ici , avec ton code : (meme punition ! )
https://youtu.be/MQBjzlOve78
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
JohnJohnsonSHERMAN
Messages : 648
Inscription : dim. 13/déc./2015 11:05
Localisation : Allez, cherche...
Contact :

Re: Horloge 4 cadrans

Message par JohnJohnsonSHERMAN »

Image

Alors??? Peut-être que en effet sur EPB ca génére une erreur, mais en tout cas avec l'éditeur officiel, il n'y a aucune erreur. Tu vois sur cette image que le debugger est actif, et que l'application fonctionne sans erreur 8) 8)
C'est tout !
"Le bug se situe entre la chaise et le clavier"
Votre expert national en bogage et segfaults.

CPU : AMD A8 Quad core - RAM 8Gb - HDD 2To
  • Windows 10 x64 - PB 5.61 x64
  • Linux Ubuntu 16.04 LTS x64 (dual boot) - PB pas encore réinstallé
Répondre