Uhrzeit Anzeige

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Xenon

Betreff: Uhrzeit Anzeige

BeitragDi, Aug 17, 2004 18:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

ich habe mal eine nettes BB-Uhrenprogramm geschrieben.
Enthalten sind insgesammt 4 Uhren mit je einer Digitalen und einer analogen Uhr.

Die 4 Uhren zeigen:
1. Die Zeit seit der das Programm läuft
2. Die aktuelle Uhrzeit
3. Die Zeit seit dem Systemstart von Windows
4. Eine Stoppuhr

Die Stoppuhr lässt sich über die Tasten S (Start/Stopp), P (Pause bzw. besser: Zwischenzeit) und R (Reset) steuern.

Viel Spaß, Xenon

Code: [AUSKLAPPEN]
;###################################################################################################;
;#                                                                                                 #;
;#  BlitzUhr.bb                                                                                    #;
;#  ===========                                                                                    #;
;#                                                                                                 #;
;#  Autor:  Jörg (Xenon) Müller                                                                    #;
;#  Datum:  17.08.2004                                                                             #;
;#  Zweck:  Benutzen der Zeit- und Sin-/Cos-Funktionen für eine Uhranzeige, Analog und Digital     #;
;#                                                                                                 #;
;###################################################################################################;

; Konstanten für die Steuerung der Stoppuhr
Const KEY_START      = 31
Const KEY_PAUSE      = 25
Const KEY_RESET      = 19

; Konstanten für die Stoppuhr Statis
Const SS_STOP      = 0
Const SS_RUN      = 1
Const SS_PAUSE      = 2

; Größe eines Digitalen Pixels
Const cDigiSize   = 2

; Größe der Zeiger und des Rahmenradius
Const cMainRadius   = 56*cDigiSize/2
Const cMSRadius      = 50.0*cMainRadius/60.0
Const cSecRadius   = 45.0*cMainRadius/60.0
Const cMinRadius   = 40.0*cMainRadius/60.0
Const cHrRadius      = 30.0*cMainRadius/60.0

; Zeitvariablen
Local starttime = MilliSecs()
Local ms, s, m, h

Local temp$ = CurrentTime$()
Local timetime

Repeat
   timetime = MilliSecs()
Until temp$ <> CurrentTime$()

Local stoptime, curstoptime, stopstate

Local time
Local lasttime = MilliSecs()

; Initialisierung
AppTitle "BlitzUhr"
Graphics cMainRadius*4+15, cMainRadius*4+30+cDigiSize*14, 0, 2
SetBuffer BackBuffer()
SeedRnd MilliSecs()

; Hauptschleife
Repeat
   ; Framezeit berechnen
   time = MilliSecs()-lasttime
   lasttime = MilliSecs()
   
   ; Stoppuhr updaten
   Select stopstate
   Case SS_RUN
      curstoptime = curstoptime + time
      stoptime = curstoptime
   Case SS_PAUSE
      curstoptime = curstoptime + time
   End Select
   
   ; Stoppuhr steuern
   ; Start/Stopp
   If KeyHit(KEY_START) Then
      If (stopstate = SS_STOP) Or (stopstate = SS_PAUSE) Then
         stopstate = SS_RUN
      Else
         stopstate = SS_STOP
      End If
   End If
   
   ; Reset
   If KeyHit(KEY_RESET) Then
      curstoptime = 0
      stoptime = 0
   End If
   
   ; Pause
   If KeyHit(KEY_PAUSE) Then
      stopstate = SS_PAUSE
   End If
   
   ; Laufzeit des Programmes ausrechnen
   ms = MilliSecs()-starttime
   s = ms / 1000
   m = s / 60
   h = m / 60
   
   ; Laufzeit anzeigen
   DrawAnalogHour(5, 5, s, m, h, ms, True)
   DrawDigitalHour(5, cMainRadius*2+10, s, m, h, ms, True)
   
   ; Aktuelle Uhrzeit ausrechnen
   ms = MilliSecs()-timetime
   s = Int(Right$(CurrentTime$(), 2))
   m = Int(Mid$(CurrentTime$(), 4, 2))
   h = Int(Left$(CurrentTime$(), 2))
   
   ; Aktuelle Uhrzeit anzeigen
   DrawAnalogHour(cMainRadius*2+10, 5, s, m, h, ms, True)
   DrawDigitalHour(cMainRadius*2+10, cMainRadius*2+10, s, m, h, ms, True)
   
   ; Zeit seit Windowsstart ausrechnen
   ms = MilliSecs()
   s = ms / 1000
   m = s / 60
   h = m / 60
   
   ; Windowsstartzeit anzeigen
   DrawAnalogHour(5, cMainRadius*2+15+cDigiSize*7, s, m, h, ms, True)
   DrawDigitalHour(5, cMainRadius*4+25+cDigiSize*7, s, m, h, ms, True)
   
   ; Stoppuhrzeit ausrechnen
   ms = stoptime
   s = ms / 1000
   m = s / 60
   h = m / 60
   
   ; Stoppuhrzeit anzeigen
   DrawAnalogHour(cMainRadius*2+10, cMainRadius*2+15+cDigiSize*7, s, m, h, ms, True)
   DrawDigitalHour(cMainRadius*2+10, cMainRadius*4+25+cDigiSize*7, s, m, h, ms, True)
   
   ; Bildschirmaktinen
   Flip
   Cls
Until KeyDown(1)
End

; Zeichnet eine analoge Uhr
Function DrawAnalogHour(x, y, s, m, h, ms = 0, dms = False)
   ; Winkel berechnen
   Local fs# = 360.0 / 60.0 * (Abs(s) Mod 60) - 90
   Local fm# = 360.0 / 60.0 * (Abs(m) Mod 60) - 90
   Local fh# = 360.0 / 12.0 * (Abs(h) Mod 12) - 90
   Local fms# = 360.0 / 1000.0 * (Abs(ms) Mod 1000) - 90
   
   ; Rahmen
   Oval x, y, cMainRadius Shl 1, cMainRadius Shl 1, 0
   
   ; Millisekundenzeiger
   If dms Then
      Line x + cMainRadius, y + cMainRadius, x + cMainRadius + Cos(fms)*cMSRadius, y + cMainRadius + Sin(fms)*cMSRadius
   End If
   ; Sekundenzeiger
   Line x + cMainRadius, y + cMainRadius, x + cMainRadius + Cos(fs)*cSecRadius, y + cMainRadius + Sin(fs)*cSecRadius
   ; Minutenzeiger
   Line x + cMainRadius, y + cMainRadius, x + cMainRadius + Cos(fm)*cMinRadius, y + cMainRadius + Sin(fm)*cMinRadius
   ; Stundenzeiger
   Line x + cMainRadius, y + cMainRadius, x + cMainRadius + Cos(fh)*cHrRadius, y + cMainRadius + Sin(fh)*cHrRadius
End Function

; Zeichnet eine digitale Uhr
Function DrawDigitalHour(x, y, s, m, h, ms = 0, dms = False)
   ; Parameter korrigieren
   s = Abs(s) Mod 60
   m = Abs(m) Mod 60
   h = Abs(h) Mod 24
   ms = Abs(ms) Mod 1000
   
   ; Stunden zeichnen
   DrawDigiNumber(x, y, h / 10)
   x = x + cDigiSize*3 + (cDigiSize Shl 1)
   DrawDigiNumber(x, y, h)
   x = x + cDigiSize*3 + (cDigiSize Shl 1)
   
   ; Doppelpunkt zwischen Stunden und Minuten
   Rect x + cDigiSize, y + (cDigiSize Shl 1), cDigiSize, cDigiSize
   Rect x + cDigiSize, y + (cDigiSize Shl 1) * 2, cDigiSize, cDigiSize
   x = x + cDigiSize*4
   
   ; Minuten zeichnen
   DrawDigiNumber(x, y, m / 10)
   x = x + cDigiSize*3 + (cDigiSize Shl 1)
   DrawDigiNumber(x, y, m)
   x = x + cDigiSize*3 + (cDigiSize Shl 1)
   
   ; Doppelpunkt zwischen Minuten und Sekunden zeichnen
   Rect x + cDigiSize, y + (cDigiSize Shl 1), cDigiSize, cDigiSize
   Rect x + cDigiSize, y + (cDigiSize Shl 1) * 2, cDigiSize, cDigiSize
   x = x + cDigiSize*4
   
   ; Sekunden zeichnen
   DrawDigiNumber(x, y, s / 10)
   x = x + cDigiSize*3 + (cDigiSize Shl 1)
   DrawDigiNumber(x, y, s)
   x = x + cDigiSize*3 + (cDigiSize Shl 1)
   
   If dms Then
      ; Doppelpunkt zwischen Sekunden und Millisekunden zeichnen
      Rect x + cDigiSize, y + (cDigiSize Shl 1), cDigiSize, cDigiSize
      Rect x + cDigiSize, y + (cDigiSize Shl 1) * 2, cDigiSize, cDigiSize
      x = x + cDigiSize*4
      
      ; Millisekunden zeichnen
      DrawDigiNumber(x, y, ms / 100)
      x = x + cDigiSize*3 + (cDigiSize Shl 1)
      DrawDigiNumber(x, y, ms / 10)
      x = x + cDigiSize*3 + (cDigiSize Shl 1)
      DrawDigiNumber(x, y, ms)
      x = x + cDigiSize*3 + (cDigiSize Shl 1)
   End If
End Function

; Zeichnet eine digitale Nummer
Function DrawDigiNumber(x, y, number)
   Local digi[6]
   
   ; Parameter korrigieren
   number = Abs(number) Mod 10
   
   ; Richtige Digitaldaten lesen
   Select number
   Case 0
      Restore digi0
   Case 1
      Restore digi1
   Case 2
      Restore digi2
   Case 3
      Restore digi3
   Case 4
      Restore digi4
   Case 5
      Restore digi5
   Case 6
      Restore digi6
   Case 7
      Restore digi7
   Case 8
      Restore digi8
   Case 9
      Restore digi9
   End Select
   
   ; Digitaldaten lesen
   For i = 0 To 6
      Read digi[i]
   Next
   
   ; Je nach Digitaldaten zeichnen
   If digi[0] Then Rect x + cDigiSize,                  y,                           (cDigiSize Shl 1),   cDigiSize
   If digi[1] Then Rect x,                           y + cDigiSize,                  cDigiSize,         (cDigiSize Shl 1)
   If digi[2] Then Rect x + (cDigiSize Shl 1) + cDigiSize,   y + cDigiSize,                  cDigiSize,         (cDigiSize Shl 1)
   If digi[3] Then Rect x + cDigiSize,                  y + (cDigiSize Shl 1) + cDigiSize,   (cDigiSize Shl 1),   cDigiSize
   If digi[4] Then Rect x,                           y + (cDigiSize Shl 1) * 2,         cDigiSize,         (cDigiSize Shl 1)
   If digi[5] Then Rect x + (cDigiSize Shl 1) + cDigiSize,   y + (cDigiSize Shl 1) * 2,         cDigiSize,         (cDigiSize Shl 1)
   If digi[6] Then Rect x + cDigiSize,                  y + (cDigiSize Shl 1) * 3,         (cDigiSize Shl 1),   cDigiSize
End Function

; Pixeldaten der Digitalen zahlen
.digi0
Data 1, 1, 1, 0, 1, 1, 1
.digi1
Data 0, 0, 1, 0, 0, 1, 0
.digi2
Data 1, 0, 1, 1, 1, 0, 1
.digi3
Data 1, 0, 1, 1, 0, 1, 1
.digi4
Data 0, 1, 1, 1, 0, 1, 0
.digi5
Data 1, 1, 0, 1, 0, 1, 1
.digi6
Data 1, 1, 0, 1, 1, 1, 1
.digi7
Data 1, 0, 1, 0, 0, 1, 0
.digi8
Data 1, 1, 1, 1, 1, 1, 1
.digi9
Data 1, 1, 1, 1, 0, 1, 1

D2006

Administrator

BeitragDi, Aug 17, 2004 18:34
Antworten mit Zitat
Benutzer-Profile anzeigen
täuscht das oder geht die Stoppuhr nicht immer bei null los ???
Ich mein jetzt den "DeziSekundenZeiger" Laughing

sonst: brauchbar für den ein oder anderen.

MfG

Twit

BeitragMi, Aug 18, 2004 12:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Nun ja Is´ja gans nett aber glaub die windows uhr reicht auch schon aus Very Happy
Tote leben länger.

Xenon

BeitragMi, Aug 18, 2004 13:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Code ist eigentlich rein zu Lehrzwecken gedacht, ich hab ihn nur aus langeweile geschrieben, währen ich die CS:S Beta runtergeladen habe.

Es geht um den Codestil, den jeder ungefähr so haben sollte. Vor allem um die Konstanten. Es sollten keine Zahlen, die geändert werden können frei im Code stehen, sonder nur solche Konstanten. Ändert zB mal die Konstante cDigiSize auf 1 und ihr werdet sehen wie sich ALLES anpasst, man braucht keinen Finger mehr zu rühren, damit sich die Größe der Uhren ändert.

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group