[Résolu] Tracer les chiffres d'une horloge 24 heures

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ésolu] Tracer les chiffres d'une horloge 24 heures

Message par Micoute »

Bonjour à tous, en ce moment j'ai un projet d'horloge 24 heures, mais j'ai un problème pour aligner les chiffres, car je souhaiterais un cadran de 00 à 23 qui servirait d'index pour l'aiguille des heures et je souhaiterais aussi faire un deuxième cadran de 0 à 55 pour les minutes et secondes, auriez-vous un théorème à me proposer ? Je ne vous en remercierai jamais assez !

voici mon projet inachevé:

Code : Tout sélectionner

;##################
;#      Horloge murale        #
;##################

Enumeration 
  #Fenetre_principale
EndEnumeration

Enumeration 
  #Trotteuse
  #GrandeAiguille
  #PetiteAiguille
  #Fond
EndEnumeration

Global TailleImage = 720 ; Toujours carrée et en pixels
Global Font.l,Font1.l,hdc,n.u, Dim bufrx.a(100), ang.f=-215
Global comport.s, i.a, r.u, teta.f, Pen.l

Global lBrush1.LOGBRUSH
With lBrush1
  \lbStyle = #BS_SOLID
  \lbColor = #Yellow
EndWith

Pen=0
Font=LoadFont(0, "Arial", 18)   
Font1=LoadFont(0, "Arial", 12,#PB_Font_Bold) 

If InitSprite()
Else
  End
EndIf  

Procedure fnmaxint(x.a, y.a)
  If x > y
    ProcedureReturn x
  Else
    ProcedureReturn y
  EndIf
EndProcedure

Procedure set_pen(couleur.l, largeur.l)
  With lBrush1
    \lbStyle = #BS_SOLID
    \lbColor = couleur
  EndWith
  If Pen <> 0 
    DeleteObject_(Pen)
  EndIf
  Pen = ExtCreatePen_(#PS_GEOMETRIC|#PS_ENDCAP_ROUND|#PS_JOIN_MITER|#PS_SOLID, largeur, lBrush1, 0, 0)
  SelectObject_(hdc, Pen)  
EndProcedure

Procedure set_font(font.s, taille.l)
  LoadFont(0, font, taille)   
  DrawingFont(FontID(0))
EndProcedure

If OpenWindow(#Fenetre_principale, 0, 0, TailleImage, TailleImage, "Horloge murale", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
  If OpenWindowedScreen(WindowID(#Fenetre_principale), 0, 0, TailleImage, TailleImage, 1, 0, 0)
    
    CreateSprite(#Trotteuse, 800, 800)
    CreateSprite(#GrandeAiguille, 800, 800)
    CreateSprite(#PetiteAiguille, 800, 800)
    CreateSprite(#Fond, 800, 800)
    
    If StartDrawing(SpriteOutput(#Fond)) ;- fond
      
      set_pen( 0,5)
      DrawingFont(Font1)  
      
      For i=0 To 360 Step 15
        tet = i
        ;DrawText(400-210*Cos(tet),400+210*Sin(tet), Str(i/15),$02FFFF,$0) ; affichage sur le cadran
      Next
      
      
      ;Circle(400, 400, 360, $FFFFFF) ;  Minutes
      ;Circle(400, 400, 358, 0)
      ;Circle(400, 400, 345, $FFFFFF) ; Secondes
      ;Circle(400, 400, 343, 0)
      
      ;Circle(400, 400, 210, $FFFFFF) ;  Heures
      ;Circle(400, 400, 208, 0)
      StopDrawing()
    EndIf
    
    If StartDrawing(SpriteOutput(#Trotteuse))
      LineXY(398, 550, 398, 65, RGB(200, 35, 35))
      LineXY(399, 550, 399, 60, RGB(200, 35, 35))
      LineXY(400, 550, 400, 55, RGB(200, 35, 35))
      LineXY(401, 550, 401, 60, RGB(200, 35, 35))
      LineXY(402, 550, 402, 65, RGB(200, 35, 35))
      
      Circle(400, 530, 10, RGB(200, 35, 35))
      Circle(400, 535,  9, RGB(200, 35, 35))
      Circle(400, 540,  8, RGB(200, 35, 35))
      Circle(400, 545,  7, RGB(200, 35, 35))
      Circle(400, 550,  6, RGB(200, 35, 35))
      Circle(400, 400, 15, RGB(200, 35, 35))
      StopDrawing()
    EndIf
    
    If StartDrawing(SpriteOutput(#GrandeAiguille))
      LineXY(390, 400, 380, 180, RGB(255, 255, 255))
      LineXY(380, 180, 390, 170, RGB(255, 255, 255))
      LineXY(390, 170, 390,  50, RGB(255, 255, 255))
      LineXY(390,  50, 400,  42, RGB(255, 255, 255))
      LineXY(400,  42, 410,  50, RGB(255, 255, 255))
      LineXY(410,  50, 410, 170, RGB(255, 255, 255))
      LineXY(410, 170, 420, 180, RGB(255, 255, 255))
      LineXY(420, 180, 410, 400, RGB(255, 255, 255))
      LineXY(410, 400, 390, 400, RGB(255, 255, 255))
      FillArea(400, 300, RGB(255, 255, 255), RGB(255, 255, 255))
      
      Circle(400, 400, 30, RGB(200, 35, 35))
      StopDrawing()
    EndIf
    
    If StartDrawing(SpriteOutput(#PetiteAiguille))
      LineXY(390, 400, 375, 280, RGB(255, 255, 255))
      LineXY(375, 280, 390, 260, RGB(255, 255, 255))
      LineXY(390, 260, 390, 210, RGB(255, 255, 255))
      LineXY(390, 210, 400, 195, RGB(255, 255, 255))
      LineXY(400, 195, 410, 210, RGB(255, 255, 255))
      LineXY(410, 210, 410, 260, RGB(255, 255, 255))
      LineXY(410, 260, 425, 280, RGB(255, 255, 255))
      LineXY(425, 280, 410, 400, RGB(255, 255, 255))
      LineXY(410, 400, 390, 400, RGB(255, 255, 255))
      FillArea(400, 300, RGB(255, 255, 255), RGB(255, 255, 255))
      
      StopDrawing()
    EndIf
    
  EndIf
EndIf

Repeat
  
  Evenement = WindowEvent()
  ClearScreen(RGB(0, 0, 0))
  xsec.s = FormatDate("%ss", Date())
  xmin.s = FormatDate("%ii", Date())
  xheure.s = FormatDate("%hh", Date())
  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)) / 4 ; système 24 h
  h = (Val(xheure) * 60 + Val(xmin)) / 2 ; système 12 h
  
  ZoomSprite(#Trotteuse, TailleImage, TailleImage)
  ZoomSprite(#GrandeAiguille, TailleImage, TailleImage)
  ZoomSprite(#PetiteAiguille, TailleImage, TailleImage)
  ZoomSprite(#Fond, TailleImage, TailleImage)
  
  RotateSprite(#Trotteuse, s, 0)
  RotateSprite(#GrandeAiguille, m, 0)
  RotateSprite(#PetiteAiguille, h, 0)
  
  DisplayTransparentSprite(#Fond, 0, 0, 255)
  DisplayTransparentSprite(#PetiteAiguille, 0, 0, 255)
  DisplayTransparentSprite(#GrandeAiguille, 0, 0, 255)
  DisplayTransparentSprite(#Trotteuse, 0, 0, 255)
  
  FlipBuffers()
  Delay(20)
  
Until Evenement = #PB_Event_CloseWindow

End
Dernière modification par Micoute le jeu. 28/nov./2013 10:08, modifié 2 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: Tracer les chiffres d'une horloge 24 heures

Message par Ar-S »

Salut Micoute,

Tu n'aurais pas meilleurs compte à utiliser une image fixe pour le background et à faire gigoter tes aiguilles dessus.
Je pense que le rendu ne pourra être que plus beau et la réalisation plus aisée.

Ex en te basant sur une image de ce genre
~~~~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: Tracer les chiffres d'une horloge 24 heures

Message par Micoute »

Merci beaucoup Ar-s, tu as raison, c'est surement la meilleure idée !
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: [Presque résolu] Tracer les chiffres d'une horloge 24 he

Message par Ar-S »

Je t'ai fait un petit BackGround en png (500x500 avec transparence autour de l'horloge) en me basant sur la photo du lien.
http://stock.ldvmultimedia.com/h.png
~~~~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: [Presque résolu] Tracer les chiffres d'une horloge 24 he

Message par Micoute »

Merci Ar-s, ça fait franchement génial !
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: [Presque résolu] Tracer les chiffres d'une horloge 24 he

Message par falsam »

Pas mal ce code Micoute et associé au background d'Ar-S le rendu devrait être intéressant.
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: [Presque résolu] Tracer les chiffres d'une horloge 24 he

Message par falsam »

Ar-S en relisant je crois que Microute souhaitait un cadran 23 heures.
Micoute a écrit :je souhaiterais un cadran de 00 à 23 qui servirait d'index pour l'aiguille des heures et je souhaiterais aussi faire un deuxième cadran de 0 à 55 pour les minutes et secondes,
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: [Presque résolu] Tracer les chiffres d'une horloge 24 he

Message par Micoute »

Bonsoir falsam, oui effectivement, c'est vraiment top, j'ai trouvé aussi un cadran 24 heures et c'est encore mieux !
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: [Presque résolu] Tracer les chiffres d'une horloge 24 he

Message par falsam »

C'est pas très simple mais tu aurais pu tracer tes chiffres avec une formule permettant de tracer un cercle.
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: [Presque résolu] Tracer les chiffres d'une horloge 24 he

Message par falsam »

Avant qu'on me reproche que c'est facile à dire, petit code qui peut servir de base

Code : Tout sélectionner

EnableExplicit

Enumeration
  #Mainform
  #BackGround
EndEnumeration

Define.l Event, GEvent

Global WindowStyle.i=#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered
Global Image.i
Global XC.i, YC.i, Radius.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

OpenWindow(#Mainform, 0, 0, 400, 400, "New Form", WindowStyle)
Image = CreateImage(#PB_Any, 400, 400)

;Coordonnées et rayon du point central du cercle
XC = 200
YC = 200

StartDrawing(ImageOutput(Image))

;Point central
Circle(XC, YC, 2, RGB(255, 69, 0))

;Les heures 
Radius = 100
For N = 0 To 345 Step 15
  X = XC + Radius * Cos(N * #PI / 180)
  Y = YC + Radius * Sin(N * #PI / 180)
  Circle(X,Y,3, RGB(255, 69, 0))
Next

;Les minutes
Radius = 110
For N = 0 To 364 Step 6
  X = XC + Radius * Cos(N * #PI / 180)
  Y = YC + Radius * Sin(N * #PI / 180)
  Circle(X,Y,3, RGB(152, 251, 152))
Next

StopDrawing()
ImageGadget(#BackGround, 0, 0, 400, 400, ImageID(Image))

Repeat
  Event  = WaitWindowEvent(10)
  GEvent = EventGadget()
  Select Event
    Case #PB_Event_Gadget
      Select GEvent
      EndSelect
        
    Case #PB_Event_CloseWindow
      End
  EndSelect
ForEver
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: [Presque résolu] Tracer les chiffres d'une horloge 24 he

Message par falsam »

Micoute a écrit :je souhaiterais un cadran de 00 à 23 qui servirait d'index pour l'aiguille des heures et je souhaiterais aussi faire un deuxième cadran de 0 à 55 pour les minutes et secondes
Ton code avec quelques modifications pour répondre à ta demande.

Code : Tout sélectionner

;##################
;#      Horloge murale        #
;##################
Enumeration Font
  #FontHour
  #FontMinute
EndEnumeration

Enumeration 
  #Fenetre_principale
EndEnumeration

Enumeration 
  #Trotteuse
  #GrandeAiguille
  #PetiteAiguille
  #Fond
EndEnumeration

Global TailleImage = 720 ; Toujours carrée et en pixels
Global Font.l,Font1.l,hdc,n.u, Dim bufrx.a(100), ang.f=-215
Global comport.s, i.a, r.u, teta.f, Pen.l

Global XC.i, YC.i, Radius.i ;Coordonnées et rayon du point central du cercle
Global X.f, Y.f ;Coordonnées des points sur le cercle 
Global Digit.i
Global Buffer.s

Global lBrush1.LOGBRUSH
With lBrush1
  \lbStyle = #BS_SOLID
  \lbColor = #Yellow
EndWith

Pen=0
Font=LoadFont(0, "Arial", 18)   
Font1=LoadFont(0, "Arial", 12,#PB_Font_Bold) 


If InitSprite()
Else
  End
EndIf  

Procedure fnmaxint(x.a, y.a)
  If x > y
    ProcedureReturn x
  Else
    ProcedureReturn y
  EndIf
EndProcedure

Procedure set_pen(couleur.l, largeur.l)
  With lBrush1
    \lbStyle = #BS_SOLID
    \lbColor = couleur
  EndWith
  If Pen <> 0 
    DeleteObject_(Pen)
  EndIf
  Pen = ExtCreatePen_(#PS_GEOMETRIC|#PS_ENDCAP_ROUND|#PS_JOIN_MITER|#PS_SOLID, largeur, lBrush1, 0, 0)
  SelectObject_(hdc, Pen)  
EndProcedure

Procedure set_font(font.s, taille.l)
  LoadFont(0, font, taille)   
  DrawingFont(FontID(0))
EndProcedure

If OpenWindow(#Fenetre_principale, 0, 0, TailleImage, TailleImage, "Horloge murale", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
  If OpenWindowedScreen(WindowID(#Fenetre_principale), 0, 0, TailleImage, TailleImage, 1, 0, 0)
    
    CreateSprite(#Trotteuse, 800, 800)
    CreateSprite(#GrandeAiguille, 800, 800)
    CreateSprite(#PetiteAiguille, 800, 800)
    CreateSprite(#Fond, 800, 800)
    
    LoadFont(#FontHour, "Arial", 18, #PB_Font_Bold)
    LoadFont(#FontMinute, "Arial", 15)
    
    If StartDrawing(SpriteOutput(#Fond)) ;- fond
      
      ;Coordonnées du point central du cercle
      XC = 400
      YC = 400

      ;Point central
      Circle(XC, YC, 2, RGB(255, 69, 0))

      ;Les heures 
      Radius = 220
      For N = 0 To 345 Step 15
        X = XC + Radius * Cos(N * #PI / 180)
        Y = YC + Radius * Sin(N * #PI / 180)
        Circle(X,Y,3, RGB(255, 69, 0))
      Next

      ;Les minutes
      Radius = 360
      For N = 0 To 364 Step 6
        X = XC + Radius * Cos(N * #PI / 180)
        Y = YC + Radius * Sin(N * #PI / 180)
        Circle(X,Y,3, RGB(128, 128, 128))
      Next

      ;Les Chiffres des heures 
      Digit=5
      Radius = 260
      DrawingFont(FontID(#FontHour))
      For N = 0 To 345 Step 15
        Digit+1
        If Digit>24
          Digit = 1
        EndIf
  
        X = XC + Radius * Cos(N * #PI / 180)
        Y = YC + Radius * Sin(N * #PI / 180)
        Buffer=Str(Digit)
  
        DrawingMode(#PB_2DDrawing_Transparent)
        DrawText(X-TextWidth(Buffer)/2, Y-TextHeight(Buffer)/2, Buffer, RGB(255, 255, 255))
        DrawingMode(#PB_2DDrawing_Default)
      Next
      
      ;Les Chiffres des minutes
      Digit=15
      Radius = 380
      DrawingFont(FontID(#FontMinute))
      For N = 0 To 364 Step 6
        Digit+1
        If Digit>60
          Digit = 1
        EndIf
  
        X = XC + Radius * Cos(N * #PI / 180)
        Y = YC + Radius * Sin(N * #PI / 180)
        Buffer=Str(Digit)
  
        DrawingMode(#PB_2DDrawing_Transparent)
        DrawText(X-TextWidth(Buffer)/2, Y-TextHeight(Buffer)/2, Buffer, RGB(255, 255, 255))
        DrawingMode(#PB_2DDrawing_Default)
      Next
      
      
      set_pen( 0,5)
      DrawingFont(Font1)  
      
      For i=0 To 360 Step 15
        tet = i
        ;DrawText(400-210*Cos(tet),400+210*Sin(tet), Str(i/15),$02FFFF,$0) ; affichage sur le cadran
      Next
      
      
      ;Circle(400, 400, 360, $FFFFFF) ;  Minutes
      ;Circle(400, 400, 358, 0)
      ;Circle(400, 400, 345, $FFFFFF) ; Secondes
      ;Circle(400, 400, 343, 0)
      
      ;Circle(400, 400, 210, $FFFFFF) ;  Heures
      ;Circle(400, 400, 208, 0)
      StopDrawing()
    EndIf
    
    If StartDrawing(SpriteOutput(#Trotteuse))
      LineXY(398, 550, 398, 65, RGB(200, 35, 35))
      LineXY(399, 550, 399, 60, RGB(200, 35, 35))
      LineXY(400, 550, 400, 55, RGB(200, 35, 35))
      LineXY(401, 550, 401, 60, RGB(200, 35, 35))
      LineXY(402, 550, 402, 65, RGB(200, 35, 35))
      
      Circle(400, 530, 10, RGB(200, 35, 35))
      Circle(400, 535,  9, RGB(200, 35, 35))
      Circle(400, 540,  8, RGB(200, 35, 35))
      Circle(400, 545,  7, RGB(200, 35, 35))
      Circle(400, 550,  6, RGB(200, 35, 35))
      Circle(400, 400, 15, RGB(200, 35, 35))
      StopDrawing()
    EndIf
    
    If StartDrawing(SpriteOutput(#GrandeAiguille))
      LineXY(390, 400, 380, 180, RGB(255, 255, 255))
      LineXY(380, 180, 390, 170, RGB(255, 255, 255))
      LineXY(390, 170, 390,  50, RGB(255, 255, 255))
      LineXY(390,  50, 400,  42, RGB(255, 255, 255))
      LineXY(400,  42, 410,  50, RGB(255, 255, 255))
      LineXY(410,  50, 410, 170, RGB(255, 255, 255))
      LineXY(410, 170, 420, 180, RGB(255, 255, 255))
      LineXY(420, 180, 410, 400, RGB(255, 255, 255))
      LineXY(410, 400, 390, 400, RGB(255, 255, 255))
      FillArea(400, 300, RGB(255, 255, 255), RGB(255, 255, 255))
      
      Circle(400, 400, 30, RGB(200, 35, 35))
      StopDrawing()
    EndIf
    
    If StartDrawing(SpriteOutput(#PetiteAiguille))
      LineXY(390, 400, 375, 280, RGB(255, 255, 255))
      LineXY(375, 280, 390, 260, RGB(255, 255, 255))
      LineXY(390, 260, 390, 210, RGB(255, 255, 255))
      LineXY(390, 210, 400, 195, RGB(255, 255, 255))
      LineXY(400, 195, 410, 210, RGB(255, 255, 255))
      LineXY(410, 210, 410, 260, RGB(255, 255, 255))
      LineXY(410, 260, 425, 280, RGB(255, 255, 255))
      LineXY(425, 280, 410, 400, RGB(255, 255, 255))
      LineXY(410, 400, 390, 400, RGB(255, 255, 255))
      FillArea(400, 300, RGB(255, 255, 255), RGB(255, 255, 255))
      
      StopDrawing()
    EndIf
    
  EndIf
EndIf

Repeat
  
  Evenement = WindowEvent()
  ClearScreen(RGB(0, 0, 0))
  xsec.s = FormatDate("%ss", Date())
  xmin.s = FormatDate("%ii", Date())
  xheure.s = FormatDate("%hh", Date())
  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)) / 4 ; système 24 h
  h = (Val(xheure) * 60 + Val(xmin)) / 2 ; système 12 h
  
  ZoomSprite(#Trotteuse, TailleImage, TailleImage)
  ZoomSprite(#GrandeAiguille, TailleImage, TailleImage)
  ZoomSprite(#PetiteAiguille, TailleImage, TailleImage)
  ZoomSprite(#Fond, TailleImage, TailleImage)
  
  RotateSprite(#Trotteuse, s, 0)
  RotateSprite(#GrandeAiguille, m, 0)
  RotateSprite(#PetiteAiguille, h, 0)
  
  DisplayTransparentSprite(#Fond, 0, 0, 255)
  DisplayTransparentSprite(#PetiteAiguille, 0, 0, 255)
  DisplayTransparentSprite(#GrandeAiguille, 0, 0, 255)
  DisplayTransparentSprite(#Trotteuse, 0, 0, 255)
  
  FlipBuffers()
  Delay(20)
  
Until Evenement = #PB_Event_CloseWindow

End
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: [Presque résolu] Tracer les chiffres d'une horloge 24 he

Message par Micoute »

Bonjour falsam et merci énormément car là, c'est vraiment ce que je souhaitais faire, du même coup, ça me raccourcit vraiment mon programme, car j'ai nettoyé tout ce qui ne servait plus !

Voici mon horloge murale:

Code : Tout sélectionner

;##################
;#      Horloge murale        #
;##################
Enumeration Font
  #FontHour
  #FontMinute
EndEnumeration

Enumeration Fenetre
  #Fenetre_principale
EndEnumeration

Enumeration Sprites
  #Trotteuse
  #GrandeAiguille
  #PetiteAiguille
  #Fond
EndEnumeration

Global TailleImage = 720 ; Toujours carrée et en pixels

Global XC.i, YC.i, Radius.i ;Coordonnées et rayon du point central du cercle
Global X.f, Y.f ;Coordonnées des points sur le cercle 
Global Digit.i
Global Buffer.s


If InitSprite()
Else
  End
EndIf

If OpenWindow(#Fenetre_principale, 0, 0, TailleImage, TailleImage, "Horloge murale", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
  If OpenWindowedScreen(WindowID(#Fenetre_principale), 0, 0, TailleImage, TailleImage, 1, 0, 0)
    
    CreateSprite(#Trotteuse, 800, 800)
    CreateSprite(#GrandeAiguille, 800, 800)
    CreateSprite(#PetiteAiguille, 800, 800)
    CreateSprite(#Fond, 800, 800)
    
    LoadFont(#FontHour, "Arial", 24, #PB_Font_Bold)
    LoadFont(#FontMinute, "Arial", 15)
    
    If StartDrawing(SpriteOutput(#Fond)) ;- fond
      
      ;Coordonnées du point central du cercle
      XC = 400
      YC = 400

      ;Point central
      Circle(XC, YC, 2, RGB(255, 69, 0))

      ;Les points des heures 
      Radius = 220
      For N = 0 To 345 Step 15
        X = XC + Radius * Cos(N * #PI / 180)
        Y = YC + Radius * Sin(N * #PI / 180)
        Circle(X,Y,3, RGB(255, 69, 0))
      Next

      ;Les points des minutes
      Radius = 360
      For N = 0 To 364 Step 6
        X = XC + Radius * Cos(N * #PI / 180)
        Y = YC + Radius * Sin(N * #PI / 180)
        Circle(X,Y,3, RGB(128, 128, 128))
      Next

      ;Les Chiffres des heures 
      Digit=5
      Radius = 260
      DrawingFont(FontID(#FontHour))
      For N = 0 To 345 Step 15
        Digit+1
        If Digit>23
          Digit = 0
        EndIf
  
        X = XC + Radius * Cos(N * #PI / 180)
        Y = YC + Radius * Sin(N * #PI / 180)
        Buffer=Str(Digit)
  
        DrawingMode(#PB_2DDrawing_Transparent)
        DrawText(X-TextWidth(Buffer)/2, Y-TextHeight(Buffer)/2, Buffer, RGB(255, 255, 255))
        DrawingMode(#PB_2DDrawing_Default)
      Next
      
      ;Les Chiffres des minutes
      Digit=15
      Radius = 380
      DrawingFont(FontID(#FontMinute))
      For N = 1 To 359 Step 6
        Digit+1
        If Digit>60
          Digit = 1
        EndIf
  
        X = XC + Radius * Cos(N * #PI / 180)
        Y = YC + Radius * Sin(N * #PI / 180)
        Buffer=Str(Digit-1)
  
        DrawingMode(#PB_2DDrawing_Transparent)
        DrawText(X-TextWidth(Buffer)/2, Y-TextHeight(Buffer)/2, Buffer, RGB(255, 255, 255))
        DrawingMode(#PB_2DDrawing_Default)
      Next
      
      StopDrawing()
    EndIf
    
    If StartDrawing(SpriteOutput(#Trotteuse))
      LineXY(398, 550, 398, 65, RGB(200, 35, 35))
      LineXY(399, 550, 399, 60, RGB(200, 35, 35))
      LineXY(400, 550, 400, 55, RGB(200, 35, 35))
      LineXY(401, 550, 401, 60, RGB(200, 35, 35))
      LineXY(402, 550, 402, 65, RGB(200, 35, 35))
      
      Circle(400, 530, 10, RGB(200, 35, 35))
      Circle(400, 535,  9, RGB(200, 35, 35))
      Circle(400, 540,  8, RGB(200, 35, 35))
      Circle(400, 545,  7, RGB(200, 35, 35))
      Circle(400, 550,  6, RGB(200, 35, 35))
      Circle(400, 400, 15, RGB(200, 35, 35))
      StopDrawing()
    EndIf
    
    If StartDrawing(SpriteOutput(#GrandeAiguille))
      LineXY(390, 400, 380, 180, RGB(255, 255, 255))
      LineXY(380, 180, 390, 170, RGB(255, 255, 255))
      LineXY(390, 170, 390,  50, RGB(255, 255, 255))
      LineXY(390,  50, 400,  42, RGB(255, 255, 255))
      LineXY(400,  42, 410,  50, RGB(255, 255, 255))
      LineXY(410,  50, 410, 170, RGB(255, 255, 255))
      LineXY(410, 170, 420, 180, RGB(255, 255, 255))
      LineXY(420, 180, 410, 400, RGB(255, 255, 255))
      LineXY(410, 400, 390, 400, RGB(255, 255, 255))
      FillArea(400, 300, RGB(255, 255, 255), RGB(255, 255, 255))
      
      Circle(400, 400, 30, RGB(200, 35, 35))
      StopDrawing()
    EndIf
    
    If StartDrawing(SpriteOutput(#PetiteAiguille))
      LineXY(390, 400, 375, 280, RGB(255, 255, 255))
      LineXY(375, 280, 390, 260, RGB(255, 255, 255))
      LineXY(390, 260, 390, 210, RGB(255, 255, 255))
      LineXY(390, 210, 400, 195, RGB(255, 255, 255))
      LineXY(400, 195, 410, 210, RGB(255, 255, 255))
      LineXY(410, 210, 410, 260, RGB(255, 255, 255))
      LineXY(410, 260, 425, 280, RGB(255, 255, 255))
      LineXY(425, 280, 410, 400, RGB(255, 255, 255))
      LineXY(410, 400, 390, 400, RGB(255, 255, 255))
      FillArea(400, 300, RGB(255, 255, 255), RGB(255, 255, 255))
      
      StopDrawing()
    EndIf
    
  EndIf
EndIf

Repeat
  
  Evenement = WindowEvent()
  ClearScreen(RGB(0, 0, 0))
  xsec.s = FormatDate("%ss", Date())
  xmin.s = FormatDate("%ii", Date())
  xheure.s = FormatDate("%hh", Date())
  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)) / 4 ; système 24 h
  ;h = (Val(xheure) * 60 + Val(xmin)) / 2 ; système 12 h
  
  ZoomSprite(#Trotteuse, TailleImage, TailleImage)
  ZoomSprite(#GrandeAiguille, TailleImage, TailleImage)
  ZoomSprite(#PetiteAiguille, TailleImage, TailleImage)
  ZoomSprite(#Fond, TailleImage, TailleImage)
  
  RotateSprite(#Trotteuse, s, 0)
  RotateSprite(#GrandeAiguille, m, 0)
  RotateSprite(#PetiteAiguille, h, 0)
  
  DisplayTransparentSprite(#Fond, 0, 0, 255)
  DisplayTransparentSprite(#PetiteAiguille, 0, 0, 255)
  DisplayTransparentSprite(#GrandeAiguille, 0, 0, 255)
  DisplayTransparentSprite(#Trotteuse, 0, 0, 255)
  
  FlipBuffers()
  Delay(20)
  
Until Evenement = #PB_Event_CloseWindow

End

Je vous envie tous, vous les programmeurs qui n'ont pas eut d'avc !
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
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: [Résolu] Tracer les chiffres d'une horloge 24 heures

Message par MLD »

Superbe :D :D
Merci a vous trois pour le partage :lol:
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: [Résolu] Tracer les chiffres d'une horloge 24 heures

Message par kernadec »

bonjour
D' abort Merci pour le partage! :D
Peut être une option pour cette horloge car on pourrait avoir une lecture plus simple
en se disant que pour heure qui est en cours l'aiguille des heures devrait rester sur le chiffe de l'heure
exemple: pour 11h59 l'aiguille devrait être sur le 11 et passerai sur le 12 en même temps que les aiguilles des minutes et des secondes arrive sur le 60
qu'en pensez vous

Cordialement
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: [Résolu] Tracer les chiffres d'une horloge 24 heures

Message par Backup »

...........
Dernière modification par Backup le lun. 18/août/2014 16:19, modifié 1 fois.
Répondre