Bahnhofsuhr

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Sylvia
verheiratet<br>1. PureGolf-Gewinner
Beiträge: 487
Registriert: 29.08.2004 09:42
Wohnort: Old Europe

Bahnhofsuhr

Beitrag 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) ?
Basic Pur = PureBasic
chromax
Beiträge: 20
Registriert: 26.09.2004 10:13
Kontaktdaten:

Beitrag 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?
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
chromax
Beiträge: 20
Registriert: 26.09.2004 10:13
Kontaktdaten:

Beitrag 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.
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag von KeyKon »

Vielleicht noch ein Sekundenzeiger... und ich würde niemals JPGE für sowas verwenden...

KeyKon
(\/) (°,,,°) (\/)
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag 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
(\/) (°,,,°) (\/)
chromax
Beiträge: 20
Registriert: 26.09.2004 10:13
Kontaktdaten:

Beitrag 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,[...]
.
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag von KeyKon »

Komisch, bei mir zeigt dir Uhr nur dann richtig wenn ich sie nach 9 Uhr drehe...

KeyKon
(\/) (°,,,°) (\/)
Benutzeravatar
Sylvia
verheiratet<br>1. PureGolf-Gewinner
Beiträge: 487
Registriert: 29.08.2004 09:42
Wohnort: Old Europe

Beitrag 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
Basic Pur = PureBasic
Benutzeravatar
crossroads
Beiträge: 244
Registriert: 29.08.2004 05:41
Wohnort: Rhine Main Area

Beitrag 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 ...
Man soll die Tür aufmachen, bevor man durchgeht ...
Antworten