Berechnung von aktueller Uhrzeit bei variabler Tageslänge

Neue Frage »

Fibu Auf diesen Beitrag antworten »
Berechnung von aktueller Uhrzeit bei variabler Tageslänge
Hallo,

ich arbeite derzeit an einem Tag und Nachtwechsel Script für ein kleines Spiel, leider stoße ich hierbei an die grenzen meiner Mathematischen Kenntnisse, oder ich stehe einfach auf dem Schlauch.

In dem Spiel ist es möglich die Tageslänge individuell einzustellen, ich kann beispielsweise bestimmen das ein kompletter Tag und Nachtwechsel nur 60 Sekunden lang ist.

Meine Frage ist nun wie ich jeweils die aktuelle Uhrzeit in Sekunden (0-86400) im Spiel berechnen kann wenn ein Tag/Nachtwechsel X Sekunden (z.B. 60) lang ist. Die Rechnung sollte anhand unserer realen Zeit erfolgen da die Zeit im Spiel auch dann vergehen soll wenn das Spiel nicht gestartet ist.

Vielleicht kann mich jemand in die richtige Richtung weisen. smile
JdPL Auf diesen Beitrag antworten »

Solange die reale Tageslänge ein Vielfaches der virtuellen ist, ist das Problem deutlich einfacher, da man das real-Datum ignorieren kann (solange dich im Spiel nur die Uhrzeit interessiert).

Also kann man annehmen, dass zum Beispiel bei 00:00:00 real im Spiel auch 00:00:00 ist.

nun sollen vielfache der virtuellen Tageslänge wieder 0 Uhr sein: 0 sec nach 00:00:00 = 60 sec nach 00:00:00 = ...

Die Sekunden seit 00:00:00 ermittelst du durch Stunde*60*60+Minuten*60+Sekunden.

Deine Position im Virtuellen Tag kannst du jetzt durch Division mit Rest bestimmen (Stichwort Modulo) und dann mit der 24h/(virtuelle Tageslänge) multiplizieren.
FibuU Auf diesen Beitrag antworten »

Vielen Dank für die schnelle Rückmeldung.

Genau bei diesem Punkt stecke ich derzeit fest, ich hoffe es ist in Ordnung wenn ich den Code zur verdeutlichung poste:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
	public float dayCycleInMinutes = 1;
	
	private const float SECOND = 1;
	private const float MINUTE = 60 * SECOND; // 60
	private const float HOUR = 60 * MINUTE; // 3600
	private const float DAY = 24 * HOUR; // 86400

[...]

	_date = System.DateTime.Now;
	_daySeconds = (_date.Hour * HOUR) + (_date.Minute * MINUTE) + _date.Second;
		
	_daySeconds %= DAY;		
	_daySeconds *= DAY / (dayCycleInMinutes * MINUTE);


So habe ich deine Erklärung verstanden.

Ich erhalte nun jedoch beispielsweise folgenden Wert zurück: 6.94224E+07

Wie komme ich nun von diesem Punkt aus an die virtuelle Uhrzeit in Sekunden? (0-86400)

p.s. System.DateTime.Now gibt jeweils die aktuelle Uhrzeit (Real) zurück, der oben genannte Code wird in einer Schleife ausgeführt.
JdPL Auf diesen Beitrag antworten »

Ich habe leider schon eine ganze Weile nicht programmiert, also weiß ich nicht, wie genau dein _date aussieht.
Allerdings sieht Zeile 11 aus, als würdest du bereits das Realdatum ignorieren,
also tut deine Zeile 13 nichts.
Ich denke, dass du nach Zeile 13 die _daySeconds eher mod virtuelleTageslänge haben möchtest. (also 0<=_daySeconds<virtuelleTageslänge)

Es wäre für mich hilfreich, wenn du ein paar Eingangs- und dazu passende Ausgangsgrößen posten würdest. Dann könnte ich deutlich schneller Prognosen, was der Teilcode genau macht, testen.
Falls dayCycleInMinutes die virtuelle Tageslänge ist, scheint dein Code bislang den Tag von 00:00 bis 24:00/(sekunden der virtuellen Tageslänge) in Zeitlupe zu durchlaufen.

edit: 6.94224E+07 klingt groß. Teilst du irgendwo durch 0?
FibuU Auf diesen Beitrag antworten »

_date besteht aus einem Array welches "Hour", "Minute" und "Second" hält. In Hour befindet sich jeweils die reale aktuelle Stunde, in "Minute" u. "Seconds" die realen Minuten/Sekunden.

Hier die Rechnung anhand einem Beispiel (13:15:20)

Code: _daySeconds = (_date.Hour * HOUR) + (_date.Minute * MINUTE) + _date.Second;

Übersetzung:
(13 * 3600) + (15 * 60) + 20;
=
47720

Code: _daySeconds *= DAY / (dayCycleInMinutes * MINUTE);

Übersetzung:
47720 * 86400 / (1 * 60)
=
68716800

Korrekt dayCycleInMinutes ist die Tageslänge in Minuten.

p.s. Ich habe nun feststellen können das es bei der Zahl "6.94224E+07" um ein Problem bei der Variablendeklaration gehandelt hat, diese muss als "long" anstatt "float" definiert werden.

p.p.s. Die ursprüngliche mod von Zeile 13 habe ich entfernt, das war in der Tat Unsinn.
JdPL Auf diesen Beitrag antworten »

Ersetz mal Zeile 13 durch:
_daySeconds %= (dayCycleInMinutes * MINUTE);

Das sollte jetzt genau das tun, was du möchtest.

Alternativ müsste es auch möglich sein, Zeile 13 und 14 zu tauschen. (Dabei werden die Zahlen aber deutlich größer)
 
 
FibuU Auf diesen Beitrag antworten »

Vielen Dank, klappt super! smile
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »