interaktive Uhr?!

heino-th

Erfahrenes Mitglied
Guten Tag,

ich versuche mich zurzeit an einer interaktiven Uhr, also das der User Stunden-,Minuten- und Sekundenzeiger selbst bewegen kann. Soll dann später auch ab dieser Zeit weiterlaufen können.

Soo, nun meine Fragen:
Sicherlich weiß ja jeder; wenn man an einer normalen uhr(also in Real) den Zeiger bewegt, bewegen sich alle anderen auch so mit.
Also wenn ich den Minutenzeiger z.b. um 360° drehe, bewegt sich der Stundenzeiger auch eine Stunde mit.
Also meine erste Frage ist, ob das technisch hinzubekommen ist, mit Flash!?

Dann da der Benutzer ja seine persönliche Zeit einstellen kann, muss ich auch die eingestellte Zeit abrufen können, aja, das ganze passiert lokal auf dem Rechner, wodurch ich mit Zinc auch Zugriff auf das System habe.
Also dachte ich mir, das ich das ganze mit der Zeit in Millisekunden bewerkställigen könnte. Soweit funktioniert das ganze auch schon. Auch das die Zeiger gleiten und nicht springen. Nur leider fängt der Stundenzeiger an der falschen Stelle an zu ticken. Also nicht bei der Zeit von der er ab laufen sollte.
Naja, also wäre das auch noch ein Problem:
Ich hatte mir das sogedacht, was auch gut funktioniert, bis auf den Stundenzeiger,
z.b. vom Minutenzeiger würde das dan so aussehen:(MS = MilliSekunden)
(vergangege Minuten in MS + verg. Sek in MS + verg MS) / 10000;
bei Sekundenzeiger:
(verg Sek in MS + verg MS) / 167;
Gut, das wars erstmal.

Würde mich freuen wenn mir bei der Umsetzung jemand helfen könnte.

Danke schonmal.

mfg heino
 
Hallo,

zu deiner ersten Frage:

das ist in Flash technisch möglich und eigentlich bloss ein rechnerisches Problem:

Für 360º Drehung des Minutenzeigers muss für den Stundenzeiger eine Änderung von 1/12 *360º stattfinden. Für Sekunden- zu Minutenzeiger verhält es sich wie 360º : 1/60*360º usw.
Umsetzen kann man das bequem via _rotation-Eigenschaft der MovieClip-Klasse.

Deine zweite Frage verstehe ich hingegen nicht ganz. Du möchtest die System-Zeit des Clients abrufen und darstellen? Dafür gibt es eine viel bequemere Lösung als alles über Millisekunden auszurechnen, nämlich das Date-Objekt, dass in deiner Flash-Hilfe ausführlichst beschrieben ist.
Möchtest du eine Zeit darstellen, die auf einer früher (ev. mit oben beschriebenen Tool) eingestellten, nicht standartisierten Zeitzone basiert, dann kommst du meiner Meinung nach um gewisse Rechnerei nicht herum.

Poste eventuell mal deine *.fla und vor allem erklär deine zweite Frage nochmals für jene wie mich (<== mit der langen Leitung ;)).

gruss
 
Zuletzt bearbeitet:
Ergänzend möchte ich noch darauf hinweisen, dass MovieClip._rotation für "eingestellte" Werte zwischen 180 und 360 Grad entsprechend negative (-180 - 0 Grad) zurückgibt:
Code:
mc._rotation = 270;
trace(mc._rotation); // gibt "-90" aus
Wenn Du die vom Benutzer "erdrehte" Zeit anhand der Rotation berechnest, solltest Du das berücksichtigen. :)

Gruß
.
 
Ok, danke schonmal für die Ansätze :D

Nun aber noch ein Problem, womit ich schon das ganze Wochenende kämpfe und weshalb ich meine Idee eigentlich verwerfen wollte :/

Hier mein bisheriger Code, eigentlich ziemlich simple, welchen sogar ich als nicht Mathemöger hinbekommen habe ;)

Code:
zStunde._rotation = (Stunde*60*60*1000+Minute*60*1000+Sekunde*1000+MilliSekunde)/240000;
zMinute._rotation = (Minute*60*1000+Sekunde*1000+MilliSekunde)/10000;
zSekunde._rotation = (Sekunde*1000+MilliSekunde)/167;
Der schwarze Code funktioniert super, jedoch der rote Teil nicht.
Der setzt mir den Zeiger total falsch, also die Rotation stimmt schon gar nicht!
Wenn es z.b. bei mir 17:30 ist, dann steht der Zeiger da bei knapp kurz vor 9!

Also da muss ich wohl noch n Denkfehler drinnen haben.
Das gleiten welches ich dadurch erreichen will, funktioniert auch super :)
Eigentlich ist das Prinzip auch ganz Einfach, ich berechne einfach die bereits vergangenen Sekunden seit 00:00:00:00 des Tages und teile sie dann durch einen bestimmten Wert, den der angiebt wieviel Millisekunden ungefär 1° benötigen:
1Tag = 86400000MS => 1° = 240000MS
1h = 3600000MS => 1° = 10000MS
1m = 60000MS => 166.66667MS

Naja, vll weis ja noch jemand von euch Rat ;)

Danke schonmal

mfg heino
 
Hi,

müsste es nicht z.B.
Code:
var swert = stunde + (minute / 60) + (sekunde / 60 / 60);
zStunde._rotation = swert * 360 / 12;
lauten? (Ich denke, Milisekunden kannst Du für den Stundenzeiger ausser acht lassen - auch die Sekunden dürften kaum zu sehen sein)

Gruß
.
 
wow,

ja, so funktionierts super! ;)
Danke für den Vorschlag.

Nur, leider kapier ich deine Rechenweise da nicht so ...

Kannste mir vll das nochmal erklären, also wie du das ausgerechnet hast.
Du formst ja da meines erkennens nach nicht auf irgendeine Zeiteinheit?!

Danke

mfg heino

//edit: Und, ich kann bei meiner Idee, also der Methode die ich Versucht habe, kann ich bei allen Zeigern mal einen bestimmten Wert und so die Umlaufgeschwindigkeit ändern?!
Das funktioniert aber da leider nicht so :D
Danke schonmal ;)

//edit2: Oder doch, funktioniert doch genauso mim Geschwindigkeit ändern :)
Dann aber noch die Fragen von oben - Danke
 
Zuletzt bearbeitet:
Hi,

zuerst berechne ich den aktuellen Stundenwert und lege ihn in einer Hilfsvariable ab (nur zur Übersicht):
Code:
var swert = stunde + (minute / 60) + (sekunde / 60 / 60);
Das ist zum einen der tatsächliche Wert, addiert mit einem 60tel der Minuten und einen 3600tel der Sekunden.

Dann wird dieser Wert mit 360 multipliziert (was der höchste Wert ist, der bei einem Stundenwert von 12 (oder 24) als Winkel dargestellt werden kann) und teile ihn durch die Anzahl der Stunden pro (halb)Tag. Beispiele für verschiedene Stundenwerte:
Code:
zStunde._rotation = 0 * 360 / 12; // ergibt 0 Grad für Stunde 0
zStunde._rotation = 3 * 360 / 12; // ergibt 90 Grad für Stunde 3
zStunde._rotation = 12 * 360 / 12; // ergibt 360 Grad für Stunde 12

Gruß
.
 
Gut, das Probelm wäre ja dann gelöst! ;)

Nun hab ich aber das nächste:
Das ganze läuft ja in onEnterFrame bzw onClipEvent(enterFrame).
Wenn ich nun dem Date-Objekt per setHours(WERT), setMinutes(WERT), usw.
einen neuen Wert zuweise, startet der zwar die funktion, also die Anzeige der Uhr an der Stelle, stellt ihn aber eben immer wieder zurück, also wenn ich die Sekunden eingestellt habe, z.b. auf 0, dann stellt er mir, wenn er auf 1 springen würde, den zeiger aber wieder auf 0 ... eigentlich ja logisch, da ja der Wert immer wieder neu zugewiesen wird.

Nun soll aber nur einmal dieser Wert zugewiesen werden und dann ab da weitergemacht werden, also mit den Werten!

Vll kann mir ma wieder einer von euch helfen. Danke ;)

mfg heino
 
Hä? Warum packst Du dann die Datumseinstellung in die onEnterFrame, wenn sie nicht dauernd ausgeführt werden soll?

Grundsätzlich:

- in onEnterFrame oder Intervalle nur das, was die ganze Zeit passieren soll

- Alles andere direkt in die Zeitleiste oder in entsprechende Ereignishandler

Gruß
.
 
ja, das is mir schon klar.

Ich hab das die ganze funktion in einer onEnterFrame weil es ja immer wieder abgespielt werden soll, damit sich der zeiger auch ändert, und damit das date objekt die aktuelle zeit aktualisiert, also neu abruft, muss das ja auch in die onEnter Frame. :D

Nun ist mein Problem, das ich aber die Werte für das Date() nur einmal setzen will! Also ich möchte nur einmal den startwert für stunden, minuten usw. angeben, und dann soll die zeit ganz normal weiterlaufen ;)

mfg heino
 
Zurück