Seite 1 von 4

Bahnhofsuhr

Verfasst: 05.03.2006 13:54
von Sylvia
Ich glaube, das ist das erste mal, das ich in diesem Unterforum weile. Der ganze
Grafikkram war noch nie mein Ding.

Wer hat Lust, eine Procedure für eine schöne 'Bahnhofsuhr' zu programmieren ?
Habe echt keinen Bock dazu. Geld gibt es keines, aber einen Credit in meiner
Heizungssteuerung ist demjenigen sicher. :D

2 Proceduren sollten folgende Aufgaben erfüllen:

ClockInit(x,y, width) bringt die Clock auf's Display
ClockSet(time) setzt die Uhrzeit (nur grafisch!)

Jetzt fällt mir gerade ein: Gibts da nicht von Windows sowas ähnliches
schon vorgekaut (DLL) ?

Verfasst: 05.03.2006 20:55
von chromax
auf's Display
Was für ein Display? Auf ein Fenster? Auf einen offenen Screen? Auf den Desktop?
ClockSet(time)
Welches Format soll "time" haben?

Verfasst: 05.03.2006 21:42
von AND51
Sylvia, hast du vor, dir selbst eine Hardware zu basteln oder auf jedenfall eine Hardware zu steuern? Wenn ja, habe ich eine weitergehende Frage.

Verfasst: 05.03.2006 22:24
von chromax
So, da wäre mal eine Lösung.
Sie braucht noch drei Grafiken:
  • hg.bmp - Zifferblatt der Uhr
  • gz.bmp - Grosser Zeiger
  • kz.bmp - Kleiner Zeiger
Alle drei Grafiken müssen gleich breit/hoch sein, und breite:höhe = 1:1. Statt bmps können auch jpgs verwendet werden, siehe Code.

Die Uhr macht kein automatisches Update, aber das war soweit ichs gelesen & verstanden habe auch keine Anforderung, oder?

Ein Sekundenzeiger fehlt noch. Brauchst Du den?

Code: Alles auswählen

InitSprite()
InitSprite3D()

; Falls Jpegs verwendet werden sollen:
; UseJPEGImageDecoder()

Procedure ClockInit(x.l, y.l, width.l)
  Global bhu_width.l
  Global bhu_x.l
  Global bhu_y.l
  bhu_width = width
  bhu_x = x
  bhu_y = y
  Global bhu_uhg.l
  Global bhu_ugz.l
  Global bhu_ukz.l
  bhu_uhg = 1
  bhu_ugz = 2
  bhu_ukz = 3
  LoadSprite(bhu_uhg, "hg.bmp", #PB_Sprite_Texture)
  LoadSprite(bhu_ugz, "gz.bmp", #PB_Sprite_Texture)
  LoadSprite(bhu_ukz, "kz.bmp", #PB_Sprite_Texture) ; Bitmaps Laden
  
;  Alternativ JPEG  
;   LoadSprite(bhu_uhg, "hg.jpg", #PB_Sprite_Texture)
;   LoadSprite(bhu_ugz, "gz.jpg", #PB_Sprite_Texture)
;   LoadSprite(bhu_ukz, "kz.jpg", #PB_Sprite_Texture) ; Jpegs Laden
  
  TransparentSpriteColor(bhu_uhg, 255, 255, 255)
  TransparentSpriteColor(bhu_ugz, 255, 255, 255)
  TransparentSpriteColor(bhu_ukz, 255, 255, 255)
  CreateSprite3D(bhu_uhg, bhu_uhg)
  CreateSprite3D(bhu_ugz, bhu_ugz)
  CreateSprite3D(bhu_ukz, bhu_ukz)
  ClearScreen(255, 255, 255)
  Start3D()
    ZoomSprite3D(bhu_uhg, bhu_width, bhu_width)
    ZoomSprite3D(bhu_ugz, bhu_width, bhu_width)
    ZoomSprite3D(bhu_ukz, bhu_width, bhu_width) ; Zoomen
    DisplaySprite3D(bhu_uhg, bhu_x, bhu_y)
    DisplaySprite3D(bhu_ukz, bhu_x, bhu_y)
    DisplaySprite3D(bhu_ugz, bhu_x, bhu_y) ; Anzeigen
  Stop3D()
  FlipBuffers()
EndProcedure

Procedure ClockSet(time.l)
  ; Egal wie das Format aussieht, daraus lassen sich Stunden, Minuten(, Sekunden) errechnen
  ; Zum Testen:
  stunden = 9
  minuten = 15
  ; Ende Manipulation
  ClearScreen(255, 255, 255)
  Start3D()
    RotateSprite3D(bhu_ugz, 0, 0)
    RotateSprite3D(bhu_ukz, 0, 0) ; Zurücksetzen
    ZoomSprite3D(bhu_ugz, bhu_width, bhu_width)
    ZoomSprite3D(bhu_ukz, bhu_width, bhu_width) ; Zoomen
    RotateSprite3D(bhu_ukz, (stunden.l * 30) + (minuten / 2), 0)
    RotateSprite3D(bhu_ugz, minuten.l * 6, 0) ; Drehen
    DisplaySprite3D(bhu_uhg, bhu_x, bhu_y)
    DisplaySprite3D(bhu_ugz, bhu_x, bhu_y)
    DisplaySprite3D(bhu_ukz, bhu_x, bhu_y) ; Anzeigen
  Stop3D()
  FlipBuffers()
EndProcedure

If OpenWindow(0, 0, 0, 500, 500, #PB_Window_SystemMenu, "")
  If OpenWindowedScreen(WindowID(0), 0, 0, 500, 500, 0, 0, 0)
    ClockInit(10, 10, 200)
    ClockSet(0)
    Repeat
      Delay(1)
    Until  WindowEvent() = #PB_Event_CloseWindow
  EndIf
EndIf
/Edit:
Hier noch meine "Grafiken" die ich zum Testen verwendet habe. MS Paint :freak: bhu.zip. Schön sind die nicht, vielleicht mach ich noch welche, aber heute nimmer.

Verfasst: 05.03.2006 23:37
von KeyKon
Vielleicht noch ein Sekundenzeiger... und ich würde niemals JPGE für sowas verwenden...

KeyKon

Verfasst: 05.03.2006 23:56
von KeyKon
Ich hab das ganze mal umgeformt + Sekunden:

Code: Alles auswählen

InitSprite() 
InitSprite3D() 


UsePNGImageDecoder()

Procedure ClockInit(x.l, y.l, width.l) 
  Global bhu_width.l 
  Global bhu_x.l 
  Global bhu_y.l 
  bhu_width = width 
  bhu_x = x 
  bhu_y = y 
  Enumeration
    #bhu_uhg
    #bhu_ugz 
    #bhu_ukz
    #bhu_usz
  EndEnumeration
  
  LoadSprite(#bhu_uhg, "Zifferblatt.png", #PB_Sprite_Texture) 
  LoadSprite(#bhu_ukz, "Stunden.png", #PB_Sprite_Texture) 
  LoadSprite(#bhu_ugz, "Minuten.png", #PB_Sprite_Texture) 
  LoadSprite(#bhu_usz, "Sekunden.png", #PB_Sprite_Texture) ; PNGs Laden 
  
  TransparentSpriteColor(#bhu_uhg, 255, 255, 255) 
  TransparentSpriteColor(#bhu_ugz, 255, 255, 255) 
  TransparentSpriteColor(#bhu_ukz, 255, 255, 255) 
  TransparentSpriteColor(#bhu_usz, 255, 255, 255)
  CreateSprite3D(#bhu_uhg, #bhu_uhg) 
  CreateSprite3D(#bhu_ugz, #bhu_ugz) 
  CreateSprite3D(#bhu_ukz, #bhu_ukz) 
  CreateSprite3D(#bhu_usz, #bhu_usz)
  ClearScreen(255, 255, 255)
  Start3D()
    ZoomSprite3D(#bhu_uhg, bhu_width, bhu_width) 
    ZoomSprite3D(#bhu_ugz, bhu_width, bhu_width) 
    ZoomSprite3D(#bhu_ukz, bhu_width, bhu_width)
    ZoomSprite3D(#bhu_usz, bhu_width, bhu_width) ; Zoomen 
    
    DisplaySprite3D(#bhu_uhg, bhu_x, bhu_y) 
    DisplaySprite3D(#bhu_ukz, bhu_x, bhu_y) 
    DisplaySprite3D(#bhu_ugz, bhu_x, bhu_y)
    DisplaySprite3D(#bhu_usz, bhu_x, bhu_y) ; Anzeigen 
  Stop3D() 
  FlipBuffers() 
EndProcedure 

Procedure ClockSet(time.l) 
  ; Egal wie das Format aussieht, daraus lassen sich Stunden, Minuten(, Sekunden) errechnen 
  ; Zum Testen: 
  stunden = Hour(time)
  minuten = Minute(time)
  sekunden = Second(time)
  ; Ende Manipulation 
  ClearScreen(255, 255, 255) 
  Start3D() 
    RotateSprite3D(#bhu_ugz, 0, 0) 
    RotateSprite3D(#bhu_ukz, 0, 0) 
    RotateSprite3D(#bhu_usz, 0, 0) ; Zurücksetzen
    ZoomSprite3D(#bhu_ugz, bhu_width, bhu_width) 
    ZoomSprite3D(#bhu_ukz, bhu_width, bhu_width)
    ZoomSprite3D(#bhu_usz, bhu_width, bhu_width) ; Zoomen 
    RotateSprite3D(#bhu_ukz, (stunden.l * 30) + (minuten / 2), 0) 
    RotateSprite3D(#bhu_ugz, minuten.l * 6, 0)
    RotateSprite3D(#bhu_usz, sekunden.l * 6, 0) ; Drehen 
    DisplaySprite3D(#bhu_uhg, bhu_x, bhu_y) 
    DisplaySprite3D(#bhu_ukz, bhu_x, bhu_y) 
    DisplaySprite3D(#bhu_ugz, bhu_x, bhu_y)
    DisplaySprite3D(#bhu_usz, bhu_x, bhu_y) ; Anzeigen 
  Stop3D() 
  FlipBuffers() 
EndProcedure 

If OpenWindow(0, 0, 0, 500, 500, #PB_Window_SystemMenu, "") 
  If OpenWindowedScreen(WindowID(0), 0, 0, 500, 500, 0, 0, 0) 
    ClockInit(10, 10, 480)
    Repeat 
      ClockSet(Date())
      Delay(20) 
    Until  WindowEvent() = #PB_Event_CloseWindow 
  EndIf 
EndIf
Hier die PNG-Zip.

Es gäbe übrigens noch zu sagen, das viele ATI-Grafikkarten nur Schwarz als Transparente Farbe bei Sprite3D annehmen. Aufgrund des Transparent wäre JPEG übrigens sowiso in die Hose gegangen...

KeyKon

Verfasst: 06.03.2006 01:16
von chromax
Dass ich nicht an die "JPG & Transparenz = plöt" gedacht habe ist etwas /:->

Aber: Hast du den Code mal ausgeführt? Denn alle Zeiger in deinen PNG's zeigen im Originalbild nach 9 Uhr. Damit zeigt die Uhr die Zeit so an, als ob sie du auf die Seite gekippt hättest:

Bild
Vergleiche Uhr in der Taskbar mit der Bahnhofsuhr.
Lösung: Alle Zeiger in den Bildern nach 12 Uhr zeigen lassen. Noch Besser: Gleich schönere Bilder basteln. :allright:

Jetzt müsste nur noch eine Lösung für NT4-Systeme her, denn:
Die Sprite3D-Befehle laufen nicht unter Windows NT 4, da hierfür mindestens DirectX7 benötigt wird.
und
DirectX 7 wird für das Sprite-Handling benutzt,[...]
.

Verfasst: 06.03.2006 01:30
von KeyKon
Komisch, bei mir zeigt dir Uhr nur dann richtig wenn ich sie nach 9 Uhr drehe...

KeyKon

Verfasst: 06.03.2006 11:26
von Sylvia
Danke, @chromax/KeyKon ! :allright:

Das funktioniert ja schon recht prächtig. Ich denke, das
werde ich einfach so übernehmen. Allerdings habe ich den
Style etwas Bahnhofsuhrmässiger gemacht. :wink:

Wenn Interesse an den Grafiken besteht: Hier sind die Bitmaps

In meinen BMP-Graphiken müsste man den Sekundenzeiger noch
etwas 'justieren' (graphisch). Ich kriege das nicht auf die Reihe.

@And51:
Guckst du hier: http://forums.purebasic.com/german/viewtopic.php?t=6680
und noch zum Thema hier: http://forums.purebasic.com/german/viewtopic.php?t=7195
und noch zum Thema hier: http://forums.purebasic.com/german/viewtopic.php?t=7130

Verfasst: 06.03.2006 12:21
von crossroads
Sylvia hat geschrieben:In meinen BMP-Graphiken müsste man den Sekundenzeiger noch
etwas 'justieren' (graphisch). Ich kriege das nicht auf die Reihe.
Hab das Ziffernblatt mal zentriert; damit sieht's jetzt recht ordentlich aus.
Ziffernblatt - Rechtsklick ... Speichern unter ...