C# XNA Nedräknare till visst datum genom DateTime

Permalänk

C# XNA Nedräknare till visst datum genom DateTime

Hej!

Har inte behövt hjälp på programmering på riktigt länge, men nu har jag börjat fiffla med lite mjukvara som behövs till ett LAN.

Vad jag har:
Kod som kan ropa på en funktion som felaktigt räknar ut skillnaden mellan ett DateTime som är nuet, och ett DateTime som är det den ska räkna ner till (2014-04-16 19:00), vilket funktionen gör till en string som kan visas som en SpriteBatch.Draw.
Vad jag vill ha:
Hur man genom DateTime kan få kod att räkna ner till en viss tidpunkt.

Försök 1:
(blackouttimer är en string för timern som ska visas, dateofblackout är datumet och tiden då nersläckningen sker.)

int seconds = (DateOfBlackout.TimeOfDay.Seconds - dateTime.TimeOfDay.Seconds); int minutes = (DateOfBlackout.TimeOfDay.Minutes - dateTime.TimeOfDay.Minutes); int hours = (DateOfBlackout.TimeOfDay.Hours - dateTime.TimeOfDay.Hours); int finalminutes = seconds - minute); int finalhours = finalminutes - (hours; BlackoutTimer = finalhours.ToString()+ ":" + (finalminutes).ToString();

Försök 2:

BlackoutTimer = (DateOfBlackout.TimeOfDay.Hours - dateTime.TimeOfDay.Hours).ToString(); BlackoutTimer += ":" + (DateOfBlackout.TimeOfDay.Minutes - dateTime.TimeOfDay.Minutes).ToString(); BlackoutTimer += ":" + (DateOfBlackout.TimeOfDay.Seconds - dateTime.TimeOfDay.Seconds).ToString();

Inget av vardera fungerar som de ska. T.ex så ifall klockan är 18:54 så är det 6 minuter kvar tills den är 19:00, men programmet räknar vad 19-18 är, alltså 1, så då tror den att det är en timma kvar. Försökte få det så att den tar minuter minus timmar men det blev knasigt.

Får ursäkta ifall jag tänkt dumt, men jag är lite trött just nu och har aldrig använt DateTime innan.

Permalänk
Medlem

Ta dig en titt på Timespan

DateTime departure = new DateTime(2010, 6, 12, 18, 32, 0); DateTime arrival = new DateTime(2010, 6, 13, 22, 47, 0); TimeSpan travelTime = arrival - departure; Console.WriteLine("{0} - {1} = {2}", arrival, departure, travelTime); // The example displays the following output: // 6/13/2010 10:47:00 PM - 6/12/2010 6:32:00 PM = 1.04:15:00

Visa signatur

Min nästan hemliga sida Ancilla, face mea laganum!
Jag har sjukast drömmar. Det ligger i min natur att avsiktligt tolka felaktigheter fel.
0
0:17 < sphr> Raz^ jag spenderade 4h med att slita bort punghåren för hand

Permalänk
Medlem

Som Raz redan nämnt så gör TimeSpan alla beräkningar du behöver.

T.ex.

DateTime later = DateTime.UtcNow.AddHours(2.23); TimeSpan diff = later.Subtract(DateTime.UtcNow); Console.WriteLine ("Hours {0}, Minutes {1} Seconds {2}", diff.Hours, diff.Minutes, diff.Seconds); Console.WriteLine ("Total Hours {0}\nTotal Minutes {1}\nTotal Seconds {2}", diff.TotalHours, diff.TotalMinutes, diff.TotalSeconds);

Visa signatur

Speldator: Ryzen 7800X3D, 64GB DDR5, RTX 3070
Server: i7-8700k, 32GB DDR4, RTX2080
Steam deck + de fiesta konsoller.

Permalänk
Skrivet av Raz:

Ta dig en titt på Timespan

DateTime departure = new DateTime(2010, 6, 12, 18, 32, 0); DateTime arrival = new DateTime(2010, 6, 13, 22, 47, 0); TimeSpan travelTime = arrival - departure; Console.WriteLine("{0} - {1} = {2}", arrival, departure, travelTime); // The example displays the following output: // 6/13/2010 10:47:00 PM - 6/12/2010 6:32:00 PM = 1.04:15:00

Skrivet av MugiMugi:

Som Raz redan nämnt så gör TimeSpan alla beräkningar du behöver.

T.ex.

DateTime later = DateTime.UtcNow.AddHours(2.23); TimeSpan diff = later.Subtract(DateTime.UtcNow); Console.WriteLine ("Hours {0}, Minutes {1} Seconds {2}", diff.Hours, diff.Minutes, diff.Seconds); Console.WriteLine ("Total Hours {0}\nTotal Minutes {1}\nTotal Seconds {2}", diff.TotalHours, diff.TotalMinutes, diff.TotalSeconds);

Tack så mycket! Verkar fungera alldeles utmärkt!
Edit:
Jag har dessvärre ett problem, den uppdaterar inte av någon anledning.
Kan ni titta på detta?
https://drive.google.com/file/d/0B0aOJX-q9H6xQ3dEUEVnYmVMeW8/...

Permalänk

Jag får inte tiden att uppdatera, det kommer upp en tid, men bara en gång. Jag förstår inte varför, tror problemet ligger här:

public static void CalculateCountdown() { TimeSpan blackoutminusnow = DateOfBlackout - dateTime; //BlackoutTimer = blackoutminusnow.ToString(); //BlackoutTimer = (DateOfBlackout.TimeOfDay.Hours - dateTime.TimeOfDay.Hours).ToString(); //BlackoutTimer += ":" + (DateOfBlackout.TimeOfDay.Minutes - dateTime.TimeOfDay.Minutes).ToString(); //BlackoutTimer += ":" + (DateOfBlackout.TimeOfDay.Seconds - dateTime.TimeOfDay.Seconds).ToString(); if (blackoutminusnow.Hours.ToString().Count<char>() < 2) { BlackoutTimer = "0" + blackoutminusnow.Hours.ToString(); } if (blackoutminusnow.Hours.ToString().Count<char>() == 2) { BlackoutTimer = blackoutminusnow.Hours.ToString(); } if (blackoutminusnow.Minutes.ToString().Count<char>() < 2) { BlackoutTimer += ":" + "0" + blackoutminusnow.Minutes.ToString(); } if (blackoutminusnow.Minutes.ToString().Count<char>() == 2) { BlackoutTimer += ":" + blackoutminusnow.Minutes.ToString(); } if (blackoutminusnow.Seconds.ToString().Count<char>() < 2) { BlackoutTimer += ":" + "0" + blackoutminusnow.Seconds.ToString(); } if (blackoutminusnow.Seconds.ToString().Count<char>() == 2) { BlackoutTimer += ":" + blackoutminusnow.Seconds.ToString(); } }

Har alla dessa if-satser för utan dem så blir klockslaget 16:03 16:3.

Permalänk
Medlem

Min fråga första raden i metoden, När uppdaterar du dateTime variablen, behöver du lagra undan variabeln? annars kör bara
TimeSpan blackoutminusnow = DateOfBlackout - DateTime.Now;

Sedan ditt andra problem med alla IFsatser, det finns ett lättare sätt, genom att använda PadLeft

Det går också att använda sig av ToString
blackoutminusnow.Hours.ToString("00");

Du kan också formatera hela raden med
string.Format("{0:00}:{1:00}:{2:00}", blackoutminusnow.Hours, blackoutminusnow.Minutes, blackoutminusnow.Seconds);

Visa signatur

Speldator: Ryzen 7800X3D, 64GB DDR5, RTX 3070
Server: i7-8700k, 32GB DDR4, RTX2080
Steam deck + de fiesta konsoller.

Permalänk
Medlem
Skrivet av MugiMugi:

Det går också att använda sig av ToString
blackoutminusnow.Hours.ToString("00");

Du kan också formatera hela raden med
string.Format("{0:00}:{1:00}:{2:00}", blackoutminusnow.Hours, blackoutminusnow.Minutes, blackoutminusnow.Seconds);

eller helt enkelt

string.Format("{0:hh\\:mm\\:ss}", blackoutminusnow);

Custom TimeSpan Format Strings

Visa signatur

as far as we can tell, the massacre went well...

Permalänk
Skrivet av MugiMugi:

Min fråga första raden i metoden, När uppdaterar du dateTime variablen, behöver du lagra undan variabeln? annars kör bara
TimeSpan blackoutminusnow = DateOfBlackout - DateTime.Now;

Sedan ditt andra problem med alla IFsatser, det finns ett lättare sätt, genom att använda PadLeft

Det går också att använda sig av ToString
blackoutminusnow.Hours.ToString("00");

Du kan också formatera hela raden med
string.Format("{0:00}:{1:00}:{2:00}", blackoutminusnow.Hours, blackoutminusnow.Minutes, blackoutminusnow.Seconds);

Skrivet av jovnas:

eller helt enkelt

string.Format("{0:hh\\:mm\\:ss}", blackoutminusnow);

Custom TimeSpan Format Strings

Tack så mycket, fungerar utmärkt!

Permalänk
Skrivet av MugiMugi:

Min fråga första raden i metoden, När uppdaterar du dateTime variablen, behöver du lagra undan variabeln? annars kör bara
TimeSpan blackoutminusnow = DateOfBlackout - DateTime.Now;

Sedan ditt andra problem med alla IFsatser, det finns ett lättare sätt, genom att använda PadLeft

Det går också att använda sig av ToString
blackoutminusnow.Hours.ToString("00");

Du kan också formatera hela raden med
string.Format("{0:00}:{1:00}:{2:00}", blackoutminusnow.Hours, blackoutminusnow.Minutes, blackoutminusnow.Seconds);

Skrivet av jovnas:

eller helt enkelt

string.Format("{0:hh\\:mm\\:ss}", blackoutminusnow);

Custom TimeSpan Format Strings

Behöver er hjälp här nu igen. Hur gör jag så att den kollar att den har gått ner till noll? För så fort den hamnar i 00:00:00:00 så går den bara ner till 23:59:59:59 sen. Jag har kodat såhär, men det fungerar bara 30 % av fallen:

if (blackoutminusnow.Hours < 1 && blackoutminusnow.Minutes < 1 && blackoutminusnow.Seconds < 1 && blackoutminusnow.Milliseconds <= 9) { countdownDone = true; } if (countdownDone == false) { blackoutminusnow = DateOfBlackout - DateTime.Now; }

Då stannar den ibland på 0.

Permalänk
Medlem

Borde du inte kunna jämföra om DateTime.Now är större eller lika med DateOfBlackout och i sådana fall sätta countdownDone till true? Dvs jag tror inte du behöver jämföra timmar, minuter och sekunder för sig utan gör bara DateTime.Now >= DateOfBlackout i if-satsen. Jag är inte helt hundra på C# men jag tror det borde fungera.

Permalänk
Medlem
Skrivet av LinusNeuman:

Behöver er hjälp här nu igen. Hur gör jag så att den kollar att den har gått ner till noll? För så fort den hamnar i 00:00:00:00 så går den bara ner till 23:59:59:59 sen. Jag har kodat såhär, men det fungerar bara 30 % av fallen:

if (blackoutminusnow.Hours < 1 && blackoutminusnow.Minutes < 1 && blackoutminusnow.Seconds < 1 && blackoutminusnow.Milliseconds <= 9) { countdownDone = true; } if (countdownDone == false) { blackoutminusnow = DateOfBlackout - DateTime.Now; }

Då stannar den ibland på 0.

Jag antar att det fortfarande är en TimeSpan du använder och då kan du jämföra med TimeSpan.Zero.

if (blackoutminusnow <= TimeSpan.Zero) { countdownDone = true; } //eller möjligen bara countdownDone = (blackoutminusnow <= TimeSpan.Zero); // beroende på om det ligger i en loop, el.dyl.

Skickades från m.sweclockers.com

Visa signatur

as far as we can tell, the massacre went well...

Permalänk
Skrivet av jovnas:

Jag antar att det fortfarande är en TimeSpan du använder och då kan du jämföra med TimeSpan.Zero.

if (blackoutminusnow <= TimeSpan.Zero) { countdownDone = true; } //eller möjligen bara countdownDone = (blackoutminusnow <= TimeSpan.Zero); // beroende på om det ligger i en loop, el.dyl.

Fungerar utmärkt!

Jag har ytterligare ett problem ni kan hjälpa mig med!
Jag har en sprite som ska flyttas ner med en acceleration, och det fungerar fint, men när den hamnar i mitten av skärmen så ska den stanna i ett par sekunder och sen åka ner igen. Det fungerar bra, MEN, spriten flyttas inte precis i mitten, utan ett snäpp under. Tror detta är koden som inte funkar:

Console.WriteLine(amount); if (!standStill) { if (amount < maxamount) { amount = amount * acceleration; } BrickPosition.Y += amount; TextPosition.Y += amount; } if (BrickPosition.Y >= (Settings.Video.Height / 2 - CountdownBrick.Height / 2) && !standStill && !hasStopped) { standStill = true; ResetAmounts(2); }

Permalänk
Medlem
Skrivet av LinusNeuman:

Jag har en sprite som ska flyttas ner med en acceleration, och det fungerar fint, men när den hamnar i mitten av skärmen så ska den stanna i ett par sekunder och sen åka ner igen. Det fungerar bra, MEN, spriten flyttas inte precis i mitten, utan ett snäpp under. Tror detta är koden som inte funkar:

Console.WriteLine(amount); if (!standStill) { if (amount < maxamount) { amount = amount * acceleration; } BrickPosition.Y += amount; TextPosition.Y += amount; } if (BrickPosition.Y >= (Settings.Video.Height / 2 - CountdownBrick.Height / 2) && !standStill && !hasStopped) { standStill = true; ResetAmounts(2); }

Det är lite svårt att veta exakt vad som är fel, men jag drar till med en gissning att BrickPosition inte är i centrum på din Brick(?), utan att det är toppen eller botten av objektet. Man kan förmodligen ställa in att objektets position anges från dess centrum, eller så får du räkna med höjden av objektet på något sätt. Vidare så gissar jag att amount, pga acceleration, inte råkar bli exakt mitt på skärmen varje gång, så i din nedersta if måste man sätta mitt-positionen exakt. Det är väl kanske det du gör i ResetAmounts iofs. Vad vet jag?

Visa signatur

as far as we can tell, the massacre went well...

Permalänk
Skrivet av jovnas:

Det är lite svårt att veta exakt vad som är fel, men jag drar till med en gissning att BrickPosition inte är i centrum på din Brick(?), utan att det är toppen eller botten av objektet. Man kan förmodligen ställa in att objektets position anges från dess centrum, eller så får du räkna med höjden av objektet på något sätt. Vidare så gissar jag att amount, pga acceleration, inte råkar bli exakt mitt på skärmen varje gång, så i din nedersta if måste man sätta mitt-positionen exakt. Det är väl kanske det du gör i ResetAmounts iofs. Vad vet jag?

Tack, men jag har testat att både dividera positionen med 2, och att ta positionen minus brickans height / 2 och allt möjligt, men beroende på hur man gör så blir det antingen precis så att överkanten är i mitten, eller att den stannar långt ner eller långt upp eller inte alls.
Har stängt av acceleration för felsökningens skull.

Om du vill så får du gärna testa programmet själv:  Ladda ner

Permalänk
Medlem

Tyvärr har jag inte XNA installerat (och finns väl inte ens till VS2013 vad jag förstår?), så jag kan inte testa.

Jag skulle rekommendera dig att sätta en breakpoint på raden "standStill = true" (How to: Set a Simple Breakpoint) och i det läget kolla vad BrickPosition.Y har för värde. Har det något annat värde än vad som motsvarar mitten på skärmen (eventuellt +/- halva höjden av objektet), så måste du själv sätta "rätt" värde på BrickPosition.Y samtidigt som du sätter standStill till true.

Visa signatur

as far as we can tell, the massacre went well...

Permalänk
Skrivet av jovnas:

Tyvärr har jag inte XNA installerat (och finns väl inte ens till VS2013 vad jag förstår?), så jag kan inte testa.

Jag skulle rekommendera dig att sätta en breakpoint på raden "standStill = true" (How to: Set a Simple Breakpoint) och i det läget kolla vad BrickPosition.Y har för värde. Har det något annat värde än vad som motsvarar mitten på skärmen (eventuellt +/- halva höjden av objektet), så måste du själv sätta "rätt" värde på BrickPosition.Y samtidigt som du sätter standStill till true.

Alright, och nej det tror jag inte.

Satte en breakpoint och får Y-värdet 198 istället för 384.

Edit: Har mixtrat lite och sänkt max hastigheten och det verkar som om det har löst sig, tack för din tid!