2D Spiele-Editor

  • C#

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von VBHero.

    2D Spiele-Editor

    Hallo,

    ich hatte vor einigen Monaten bereits ein paar Threads für mein Spiel hier erstellt und wollte eigentlich dort weiter machen, allerdings hat sich das Forum seid meinem letzten Besuch doch etwas verändert 8-) . Ein sehr gelungenes Update wie ich finde.

    Wie dem auch sei, wollte ich ein Update bezüglich meines Editors veröffentlichen. Angeregt von Videos über die Snow-Drop und Unreal4 Engine habe ich angenfangen Editor/Engine etwas zu ändern.

    Außerdem wurde das Projekt bisher dem XNA - Frameworks erstellt. Ich wurde hier im Forum darauf hingewiesen, dass das zu Problemen mit Windows 8 kommen kann, deshalb bin ich dabei alles auf MonoGame um zu stellen.

    Wie dem auch sei, das erste Update wäre der EventGraph-Editor. Den zu beschreiben würde etwas länger dauern. Deshalb habe ich ein Video erstellt habe, welches ein Event erstellt, das auf Grund einer Benutzereingabe ein Spielobjekt (im Beispiel den Spieler) in der Welt verschiebt. Der EventGraph ist dabei nicht zu 100% fertig gestellt, aber ich denke das Video zeigt den Grundgedanken dahinter recht gut.



    Nun zu meinen Fragen:

    Hat jemand bereits mit MonoGame und Farseer gearbeitet und kann mich auf eventuelle Stolpersteine hinweisen?
    Was darf auf keinen Fall an Events/Funktionen beim EventGraph fehlen um damit 2D Spiele verschiedenster Art zu erstellen?

    Viele Grüße,
    Lianos
    und wie hast du das mit den Prioritäten geregelt?
    (also nicht das grafische, das ist relativ einfach), sondern nachher, die Befehlsausführung , wenn's denn dann los geht.

    z.B. unten im Bild
    Der Counter Rechts darf ja erst hochzählen, wenn der Vergleich Rechts fertig ist und auch Stimmt.
    Dieser Vergleich darf aber erst vergleichen, wenn beide Zufallsgeneratoren Ihre Werte vom Timer bekommen haben.
    Woher weiss der Counter nun, das der Vergleich schon anliegt, und es nicht noch der vorhergehende Wert war?
    Das Problem ist noch relativ einfach. Das geht noch komplizierter. :) Wie hast du sowas gelöst? ?(





    Moin,

    also bei dir würde ich folgendes vorschlagen (Man könnte auch generics verwenden, aber ich hoffe die Idee wird klar)
    Der Code ist nur fix aus dem Kopf geschrieben und nicht vollständig, soll nur eine Idee sein, die man weiter ausbauen kann.:

    C#-Quellcode

    1. public struct ConnectionInfo
    2. {
    3. public int ConnectedWithIndex {get;set;}
    4. public Event ConnectedWith {get;set;}
    5. public ConnectionInfo(int i, Event e)
    6. {
    7. this.ConnectedWith = e;
    8. this.ConnectedWithIndex = i;
    9. }
    10. }
    11. public struct Data
    12. {
    13. public object Value {get;set;}
    14. public string Description {get;set;}
    15. public List<ConnectionInfo> Connections = new List<ConnectionInfo>();
    16. public Data(object Value, string Description)
    17. {
    18. this.Value = Value;
    19. this.Description = Description;
    20. }
    21. }
    22. public class Event
    23. {
    24. List<Data> Inputs;
    25. List<Data> Outputs;
    26. bool IsActive = false;
    27. int ID; //Kann man verwenden wenn man mehrere Events identifizieren möchte
    28. public virtual void SetInput(int index, object Data) { }
    29. public virtual void Update(float ElapsedMS) { }
    30. public virtual void Start()
    31. {
    32. isActive = true;
    33. }
    34. public virtual void Stop()
    35. {
    36. isActive = false;
    37. }
    38. }
    39. public class Timer: Event
    40. {
    41. float totalElapsedMS;
    42. public Timer()
    43. {
    44. base.Inputs.Add((bool)false, "ON/OFF");
    45. base.Inputs.Add((bool)false, "Reset");
    46. base.Inputs.Add((float)0, "Interval);
    47. public override SetInput(int index, object Data)
    48. {
    49. if (index == 0)
    50. base.Inputs[0].Value = Data as bool;
    51. //werte für alles speichern
    52. }
    53. public override Update(float ElapsedMS)
    54. {
    55. if (!base.isActive)
    56. return;
    57. this.totalElapsedMS += ElapsedMS;
    58. if (this.totalElapsedMS >= (float)Inputs[3].Value)
    59. {
    60. //Setzte die Inputs der Verbundenen Events über die Outputs: z.B.: base.Outputs[0].ConnectionInfo[0].ConnectedWithEvent.SetInput(...)
    61. //Starte ggf. das andere event z.B.: base.Outputs[0].ConnectionInfo[0].ConnectedWithEvent..Start()
    62. }
    63. }
    64. public override Stop()
    65. {
    66. this.totalElapsedMS = 0;
    67. base.Stop();
    68. }
    69. }
    70. }


    Irgendwo in deinem Code erstellst du dir nun eine List von "Events" z.B. dem "Timer" und verknüpfst deren Inputs und Outputs (über die GUI).
    Die Update-Methode rufst du in deiner Main-Loop für alle Events auf. Starten tust du den ganzen Ablauf dann indem du z.b. deinen ersten Timer startest (oder auch mehrere Timer).

    Mit dem Value der Inputs/Outputs könntest du auch prüfen welcher Input mit welchem Output verbunden werden darf (Value.GetType() == Value2.GetType())
    Eine neue Timer Instanz zur Laufzeit könnte man z.B. mit dem Activator erstellen.

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

    Hallo,
    Danke erstmal,
    wer mit was verbunden werden darf, das geht schon, auch arbeitet er schon fleissig und korrekt.
    Aber es geht halt um Prioritäten, wenn ein Timer sich z.B. selbst abschaltet aber das halt erst darf wenn...
    Also Rückkopplungen usw.

    Ist momentan halt so, das es eingänge gibt die Abfragen.. und welche die ungefragt bekommen (Events)..
    Und die Ausgänge also Hinweise geben, das sie "fertig" sind damit von Ihnen abgeholt werden kann. usw.
    naja :) halt ein schönes Thema zum tüfteln.
    Hallo,

    mal wieder ein kleines Update und damit auch ein kleines (oder auch größeres) Problem.
    Ich habe es nach langer Zeit endlich geschafft ein MonoGame Control für .NET zu finden um die Spiel-Engine direkt im Editor nutzen zu können.
    Im Beispielvideo sieht man wie sich der Spieler nach rechts bewegt, sobald man die "D" Taste gedrückt hällt.

    Das verhällt sich im richtigen Spiel wie erwartet derSpieler ist nach wenigen Millisekunden aus dem Spielfeldrand gelaufen, da die verstrichene Zeit noch nicht mit einberechnet wird.

    Allerdings sieht man im Video ganz gut, das sich der Spieler sehr langsam bewegt, da die Windows-GUI das ganze etwas bremmst. Hat jemand bereits erfahrung mit XNA und Winforms oder besser nocht MonoGame und Winforms?