[Theorie] Interpreter für Zeitgesteuerte Events

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von Eistee.

    [Theorie] Interpreter für Zeitgesteuerte Events

    Halloo 8-)

    Ich sitzte gerade vor einem neuen Teil vom next Game und ich bräuchte da ein paar Ideen eurerseits. Vorschläge wie man diese Situartion programmiertechnisch am besten Umsetzen könnte.

    Die Situartion: Eine Liste von Werte (Ereignisse) mit optionalen Parametern, welche nach einer zu jedem Ereigniss beigefügten Zeit, nach dem Start der Interpretation der Liste, interpretiert werden soll.

    __________________________
    |___Die Liste der Ereignisse:___|
    |_________________________|
    | __Ronk: A - 1,35___________|
    | __Ronk: B - 1,90___________|
    | __Zonk: B - 3,00___________|
    | __Klapp - 4,30_____________|
    | __Klapp - 11,28____________|
    | __Nicki: Eye - 11,28 ________|
    |_________________________|
    [Legende: (Ereigniss): (Parameter) - (Zeit) # Wobei die Formatierung theoretisch egal ist!.]

    Gruß

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

    Scheduler im Sinne von der kleinsten Zeiteinheit, welche in jedem Tick prüft ob die aktuelle vergangene Zeit in der Liste enthalten ist?
    Also eine art Timer mit Intervall von 20 für 0,02 Sekunden Ticks, indem die vergangene Zeit geprüft wird?

    Wäre das nicht zu CPU lastig? :S
    Ok hab gerade wieder ein Brett vorm Kopf xD

    Wie frag ich den die vergangene zeit ab?
    Das geht doch nur durch immer wieder abfragen?!

    Außer wenn ich das Intervall auf die nächte Zeitspanne setze und somit per Tick
    (Ich gehe jetzt mal von einem Timer aus), das Ereigniss aufrufe und die nächste Spanne setze. 8o

    Meintest du das so oder?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Eistee“ ()

    Kommt drauf an, wie du das Spiel realisierst.
    Angenommen, du machst das in XNA, dort hast du ja die eine große Schleife, in der die einzelnen Frames gezeichnet werden.
    In jedem Durchgang der Schleife (der Update()-Methode) würde ich die Startzeit des Programms als Zeitpunkt 0 nehmen, und in jedem Schleifendurchgang checken, ob die z.B. 10 Sekunden abgelaufen sind, z.B. 15:03:40(Startzeit) - 15:03:49(Jetztzeit) = 9 Sekunden != 10 Sekunden.
    Verstehst du, was ich sagen will? :D
    Wenn die Liste nach Zeitpunkt sortiert ist und die Zeiten bekannt sind, kannst du doch ein Thread.Sleep([Zeitintervall des ersten Eintrags]) ausführen, die gewartete Zeit von allen anderen Listeneinträgen subtrahieren und den ersten Eintrag aus der Queue entfernen, oder nicht? Das Warten sollte natürlich NICHT im Mainthread stattfinden...
    Gruß
    hal2000
    Ich habe da gerade ein paar blockaden bezüglich der Aufbau der benötigten Klassen.
    Wenn da vielleicht jemand so nett wäre mir die deklarationen aufzuschreiben wär ich sehr dankbar.
    Kann euch wenn gewünscht in die Credits packen (obwohl wie ihr bestimt wisst das nicht Millionen von leute zu gesicht bekommen werden).

    Ich dachte mir das jetzt nach einbezug eurer Vörschläge das so ungefähr zu machen:

    VB.NET-Quellcode

    1. Dim VerstricheneZeit As Double
    2. Dim EventDatenAusDerTXT As *keine ahnung*
    3. Function EventDateiAuslesen(Dateiname As String)
    4. EventDatenAusDerTXT = File.ReadAllText(Dateiname)
    5. End Sub
    6. Public Sub UpdateEvent(gameTime As GameTime)'wird jedesmal im Mainloop aufgerufen
    7. VerstricheneZeit = gameTime.TotalGameTime.TotalSeconds
    8. If VerstricheneZeit >= NextEventTime.TotalSeconds Then
    9. EventHandle(EventType)
    10. NextEventTime = MissionEventsList(i).Time
    11. NextEvent = MissionEventsList(i)
    12. End If
    13. End Sub
    14. Public Sub EventHandle(NextEvent As EventType)
    15. Select Case NextEvent
    16. Case EventType Stirb
    17. Position = xy
    18. Scale = xy
    19. EventObjektID = xy
    20. Case EventType Laufen
    21. Geschwindigkeit = xy
    22. EventObjektID = xy
    23. Case EventType Saufen
    24. Getränk = xy
    25. EventObjektID = xy
    26. Case EventType Raufen
    27. HP = xy
    28. EventObjektID = xy
    29. End Select
    30. End Sub


    Hier meine MATSCHE die sich in der nach um 4 gebildet hat lol - bitte nicht beachten ergibt alles kein Sinn:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports Microsoft.Xna.Framework
    2. Imports SpaceRebirth.GameplayKlassen.MissionEvent
    3. Imports SpaceRebirth.GameplayKlassen.Enemy
    4. Imports System.IO
    5. Namespace GameplayKlassen
    6. Class Missionen
    7. Dim MissionEventsList As List(Of MissionEvent)
    8. Dim VerstricheneZeit As Double
    9. Dim NextEventTime As TimeSpan
    10. Dim NextEvent As MissionEvent
    11. Dim i As Integer = 0
    12. Private EnemyKlassenObjektInstanz As New Enemy
    13. Public Shared Function ReadAllText(path As String) As String
    14. returnValue = File.ReadAllText(path)
    15. Dim returnValue As String
    16. End Function
    17. Public Sub UpdateMissionen(gameTime As GameTime)
    18. VerstricheneZeit = gameTime.TotalGameTime.TotalSeconds
    19. If VerstricheneZeit > NextEventTime.TotalSeconds Then
    20. NextEventTime = MissionEventsList(i).Time
    21. NextEvent = MissionEventsList(i)
    22. End If
    23. End Sub
    24. Public Sub EventHandle(NextEvent As EventType)
    25. Select Case NextEvent
    26. Case EventType.Spawn
    27. EnemyKlassenObjektInstanz.AddEnemy(, New Vector2(300, 200), 1)
    28. 'EnemyKlassenObjektInstanz.AddEnemy(, New Vector2(300, 200), 1)
    29. Case (EventType.Destroy)
    30. Case EventType.Explosion
    31. Case EventType.ShowText
    32. Case EventType.HideText
    33. Case EventType.ShowMissionText
    34. End Select
    35. End Sub
    36. End Class
    37. End Namespace
    38. Namespace GameplayKlassen
    39. Class MissionEvent
    40. Public Time As TimeSpan
    41. Enum EventType
    42. Spawn
    43. Destroy
    44. Explosion
    45. ShowText
    46. HideText
    47. ShowMissionText
    48. End Enum
    49. Public Spawn As New MissionEvent
    50. Public Destroy As New MissionEvent
    51. Public Explosion As New MissionEvent
    52. Public ShowText As New MissionEvent
    53. Public HideText As New MissionEvent
    54. Public ShowMissionText As New MissionEvent
    55. 'Werte der Klassen zuweisen
    56. Sub MissionEventKlasseninitialisieren()
    57. End Sub
    58. End Class
    59. End Namespace


    Danke
    Generiere Dir einen System.Threading.Timer (läuft in einem anderen Thread) und starte ihn bei jedem Tick neu mit der Differenzzeit zum nächsten Ereignis und raise ein Event in das Hauptfenster, das dann die entsprechende Aufgabe abarbeitet.
    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!
    Ok so kann ich es auch machen, ist vielleicht sogar etwas übersichtlicher im Code.
    Nur was mich beschäftigt ist die richtige Strucktur dahinter.

    Ich habe:

    1x Missionen.txt <-- Read All Text <-- Split ö. ä. damit je ein Event in einem Liste (Of T) Eintrag steht.

    5x Verschiedene EventTypen. jetzt überlege ich, wie ich das Differenzieren kann. Für die List(Of) müsste alle Einträge den gleichen Datentyp haben.
    ok aber dazu kommt noch, das jeder Typ eigene Parameter hat. Aber nur welche die auch zum Typ wirklich gehören.

    Naja der springende Punkt ist gibbets da eine andere Möglichkeit, als für jedes Event eine eigene Klasse zu schreiben?
    Mit überladungen klappt es ja nicht da ich dem Konstruktor ja keinen Typ zuweisen kann :wacko:

    Edit: Ich habe das Gefühl das mein Hirn heute (wie so oft xD) nicht funktioniert :rolleyes:
    Das ist ne gute Idee :)
    Mach ne "Basis"klasse, lass alle Unterklassen davon erben, dann kannst du diese Unterklassen in ne List Of Basisklasse packen und bei Bedarf casten (glaube ich, vllt. stehen dir die Listeneinträge ja schon als passende Klasse bereit)
    Ok hab komm mal wieder nicht weiter, jemand eine Ahnung wie ich das fixen kann ohne alles neu zu schreiben?

    Es gibt ein Objekt Namens NextEvent, dies ist als EventBasis deklariert.
    Zudem gibt es eine Liste welche als
    New List(Of EventBasis) deklariert wurde.

    Es werden Daten ausgelesen und unterschiedliche Objekte erstellt
    Diese Objekte sind als Klassenobjekte deklariert welche alle von EventBasis erben.

    Dim Event As New Event1
    Dim Event As New Event2
    Dim Event As New Event3
    ...

    Jede Klasse (Event1 bis Event3 ...) erbt von der Klasse EventBasis.

    Jeder dieser Objekte (es wird immer nur eins gleichzeitig erstellt) hier heitß es Event, soll in die Liste eingetragen werden.
    Das läuft auch, Liste.Add(Event).

    Nur wenn ich jetzt die Listeneinträge verarbeiten will, kann ich nicht auf die Member der "speziellen" Klassen
    Event1, Event2 ... zugreifen.
    Denke mir das liegt daran das die Liste als
    EventBasis deklariert ist und somit nur die EbentBasis Member freigegeben sind.

    Jemand eine Idee wie ich das schnell auflösen kann?

    Gruß Eistee :)

    PS: Hoffe das ganze ist etwas verständlich ausgedrückt, je später es wird desto größer ist der Müll den ich fabriziere :rolleyes:

    Edit: Also das Ziel ist es, die unterschiedlichen Objekte mit jeder seiner eigenen Membervariabel in einer Liste zu haben.

    Edit2: hat sich nun erledigt, musste alles nochmal umwerfen, war so unmöglich.

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