Einen Kalendermonat, in eine Stunde Spielzeit umwandeln...

  • VB.NET

Es gibt 27 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Einen Kalendermonat, in eine Stunde Spielzeit umwandeln...

    Da ist er wieder mit einen neuen Thema :D,

    Jeder kennt ja nun inzwischen mein Stichtag Code....

    VB.NET-Quellcode

    1. Private Sub Stichtag_Tick(sender As Object, e As EventArgs) Handles Stichtag.Tick 'Stichtag
    2. Dim ots As TimeSpan = New TimeSpan(0, 0, _Counter)
    3. _Counter -= 1
    4. If _Counter <= -1 Then
    5. _Counter = If(_showCountdown, 3600, 60)
    6. _showCountdown = Not _showCountdown
    7. If _showCountdown Then
    8. ' und so weiter...


    quasi kann der Spieler Spielen und geld verdienen und nach 60 Minuten wird abgerechnet .... 1 Minute lang

    Jetzt will ich in diesen Counter noch ein Tageszähler einbauen, habe z.b. unter dem 1 Stunden Countdown ein Datum 01.01.2000.
    Eine Ganze Stunde soll im Spiel ein Monat ergeben, also ist eine Stunde vorbei (es wird Abgerechnet) dann haben wir den 01.02.2000.
    Das so umzuschreiben ist ja kein problem, nur wie bekomm ich es hin das er 60 Minuten durch die Tage des Monats teilt.
    Also Januar 31 Tage durch 60 minuten, heißt alle ca. 116 Sek. muss ein Tag + gerechnet werden. <--- Vom Prinzip her habe ich das auch schon Teils hinbekommen aber nicht jeder Monat hat 31 Tage .... es gibt mal 31, 30, 28, 29 ... Verflixte Tage X/

    Hier die Aktion (ist nur ein Beispiel)

    VB.NET-Quellcode

    1. If Not _showCountdown Then
    2. Label_Label160.Text = $"Stichtag in: {ots.ToString()}"
    3. If _Counter = 3484 Or _Counter = 3368 Or _Counter = 3252 Or _Counter = 3136 Or _Counter = 3020 Then
    4. SystemDatum = DateAdd("d", 1, SystemDatum) 'einen Tag addrieren Zeile eins
    5. SpielDatum.Text = CType(SystemDatum, String) 'einen Tag addrieren Zeile zwei
    6. End If
    7. Else
    8. Label_Label160.Text = $"Es wird abgerechnet: {ots.ToString()}"
    9. End If
    Danke euch ... @EaranMaleasi & @Schoofi
    Aber muss ich das jetzt Monat für Monat und Jahr für Jahr angeben?

    oder könnte ich da auch meine variable "Systemdatum" nehmen also immer ausgehend vom Systemdatum (beginn 01.01.2000)

    Weil wenn ich ja jetzt sage, wenn Monat XY Jahr YX ist dann rechest du das .... das würde ja ein mega langer Code werden bis zum Jahr 3000 :D
    Ja das Spiel startet mit der Variablen Public SystemDatum As New Date(2000, 1, 1)

    wenn ich vom aktuellen Jahr und Monat ausgehe dan mache ich doch "now.Year, now.Month" und habe mein Systemdatum (01.01.2000) oder?

    Und wie weiß er jetzt das ich genau 31 Tage / 60 nehmen will ... anderen monat 28 / 60
    muss ich dazu nur einen Rechner erstellen der now.Day / 60 nimmt?
    Du baust dir eine Methode GetDaysNextMonth() die entweder einen Parameter DateTime hat, oder aber direkt mit SystemDatum arbeitet. (Ich gehe mal auf letzteres ein)
    Du prüfst zunächst, ob SystemDatum.Month < 12 ist.
    Wenn ja, rufst du einfach DateTime.DaysOfMonth(SystemDatum.Year, SystemDatum.Month + 1) auf und gibst das ergebnis zurück.
    Wenn nein, dann rufst du DateTime.DaysOfMonth(SystemDatum.Year +1, 1) auf und gibst das ergebnis zurück.
    Und nun kannst du am Anfang jedes Monats berechnen wie schnell ein Tag vergeht.
    Okay super danke , Werd Mal versuchen es so umzusetzen ... Sehr gut erklärt ....

    Also muss ich nur noch das Ergebnis durch die eine Stunde nehmen.

    Habe rausgefunden das es inMonth heißt ist ja richtig oder?

    VBHunter schrieb:

    Habe rausgefunden das es inMonth heißt ist ja richtig oder?
    Jou, habs ausm Kopf geschrieben, anstatt nachzusehen. Da passiert sowas schonmal ^^

    VBHunter schrieb:

    Also muss ich nur noch das Ergebnis durch die eine Stunde nehmen.
    Andersherum wird da ein Schuh draus. Du möchtest doch die Sekunden haben, die es benötigt, um einen ingame-Tag zu absolvieren.
    Dann musst du die 3600 Sekunden durch die Anzahl der Tage Teilen.
    Hey @EaranMaleasi .... ist das so Richtig ? (Das ist meine Methode)

    VB.NET-Quellcode

    1. Dim ErgebnisTage As Date
    2. Dim Counterzahl As New TimeSpan(0, 0, 3600)
    3. Dim Ergebnis As Date
    4. If SystemDatum.Month < 12 Then
    5. ErgebnisTage = DateTime.DaysInMonth(SystemDatum.Year, SystemDatum.Month + 1)
    6. Ergebnis = Counterzahl / ErgebnisTage
    7. Ergebnis = DateAdd("d", 1, SystemDatum)
    8. SpielDatum.Text = CType(SystemDatum, String)
    9. Else
    10. ErgebnisTage = DateTime.DaysInMonth(SystemDatum.Year + 1, 1)
    11. Ergebnis = Counterzahl / ErgebnisTage
    12. Ergebnis = DateAdd("d", 1, SystemDatum)
    13. SpielDatum.Text = CType(SystemDatum, String)
    14. End If


    er zeigt mir noch ein Fehler denke mal wegen der Variablen Integer zu Date....

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VBHunter“ ()

    1. Acker dich mal hier durch:
    Visual Studio - Empfohlene Einstellungen
    Das vielleicht hat nicht direkt etwas mit deinem Problem zu tun(eigentlich schon), jedoch wirst du damit selbst auf die Lösung des Problems kommen.

    2.

    VBHunter schrieb:

    VB.NET-Quellcode

    1. CType(SystemDatum, String)
    Du hast von 3 Möglichkeiten ein Objekt in einen String umzuwandeln, die denkbar schlechteste genommen. Jedes Objekt im .NET Framework, und ich meine absolut jedes, hat eine Methode .ToString() nutze diese, gerade bei DateTimes, da du dort das Ergebnis genau nach deinen Wünschen formatieren kannst.

    Edit @VBHunter :

    VB.NET-Quellcode

    1. Ergebnis = Counterzahl / ErgebnisTage

    Du Teilst einen zeitlichen Fixpunkt durch eine Zeitspanne. Rein logisch gesehen, was soll dabei rauskommen? Kann dabei überhaupt etwas sinnvolles rauskommen?

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „EaranMaleasi“ ()

    @EaranMaleasi also deine empfehlung mit dem Link .... das soll mich wohl auf OPTION STRICT ON hinweisen (und andere kleine einstellung IO etc) ... diese einstellungen habe ich bereits bei mir aktiviert.

    Leider komme ich immernoch nicht weiter egal wie ich es drehe und wende er sagt mir immer das DateTime.DaysInMonth(SystemDatum.Year + 1, 1) Integers sind eine Konvertierung in Date nicht möglich ist ... dann sagt er mir wieder ErgebnisTage = Double was für ein quatsch Ergebnis ist Date Dim Ergebnis As Date aber scheinbar mag VB mich nicht.

    Oder hast du noch ein kleinen Tip

    Aktuell hab ich es so Formatiert:

    VB.NET-Quellcode

    1. Dim ErgebnisTage As Integer
    2. 'Dim Counterzahl As New TimeSpan(0, 0, 35)
    3. Dim Ergebnis As Date
    4. If SystemDatum.Month < 12 Then
    5. ErgebnisTage = DateTime.DaysInMonth(SystemDatum.Year, SystemDatum.Month + 1)
    6. Ergebnis = 3600 / ErgebnisTage
    7. Ergebnis = DateAdd("d", 1, SystemDatum)
    8. SpielDatum.Text = SystemDatum.ToString
    9. Else
    10. ErgebnisTage = DateTime.DaysInMonth(SystemDatum.Year + 1, 1)
    11. Ergebnis = 3600 / ErgebnisTage
    12. Ergebnis = DateAdd("d", 1, SystemDatum)
    13. SpielDatum.Text = SystemDatum.ToString
    14. End If

    VBHunter schrieb:

    er sagt mir immer das DateTime.DaysInMonth(SystemDatum.Year + 1, 1) Integers sind eine Konvertierung in Date nicht möglich ist
    Was erwartest Du? Die Anzahl von Tagen im Monat sind nunmal ganze Zahlen (28-31), also Integers. Und kein Datum. Was stellst Du Dir denn vor, gibt die Funktion sonst zurück? Welches Datum hättest Du denn erwartet?

    VBHunter schrieb:

    dann sagt er mir wieder ErgebnisTage = Double was für ein quatsch
    Ergebnis = 3600 / ErgebnisTage: Wenn Du 3600 durch eine Zahl teilst (die zwischen 28 und 31 liegt), was erhältst Du dann? Richtig: eine Zahl, wahrscheinliche eine mit einigen Stellen nach dem Komma. Und sowas ist standardmäßig ein Double in VB. Warum sollte 3600 durch 30 ein Datum ergeben? Welches Datum erwartest Du da?

    btw: Ist DateAdd eine Funktion von Dir oder eine VB6-Funktion von Mikrosaft? Bei den empfohlenen Einstellungen geht es auch darum, den Microsoft.VisualBasic-NameSpace aus den Importverweisen rauszunehmen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VBHunter Falsche Herangehensweise.
    Nutze den Dreisatz, um Dein Problem zu lösen:
    Real:

    Quellcode

    1. Datum(Aktion) = Datum(Start) + Dauer(Aktion - Start)
    Spiel:

    Quellcode

    1. Datum(Aktion) = Datum(Start) + Dauer(ZEITFAKTOR * (Aktion - Start))
    Feddich. :D
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hm, ich dachte als Date zu rechnen da es ja so ausgegeben wird 01.01.2000 00:00 und wollte 3600 sek. Teilen durch die Zeit, so zu sagen also

    Das 3600 sek. Geteilt durch die Zeit .... Ist das Ergebnis .... Man wenn man das so schreibt kommt ein das Recht unlogisch vor ....

    Okay danke euch beiden ich werd Mal schauen ob ich nach einigen Tagen dran sitzen das Thema heut Abend endlich Mal abschließen kann.

    Kann VB denn Dreisatz :)