Genesis Game Engine 4

    • Beta
    • Open Source

    Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von Andy.

      Genesis Game Engine 4

      Genesis Game Engine

      Was ist die „Genesis Game Engine“?

      Die Genesis Game Engine ist ein auf C# basierendes Framework zum Erstellen von 2D- und 3D-Spielen. Dabei liegt der Fokus auf einer einfachen Implementierung und Verwaltung von Szenen, Spielelementen und deren Komponenten. Trotzdem wurde darauf geachtet, Funktionen wie das Rendern, die Physik und die Komponenten so abstrakt wie möglich zu gestalten, um eigene Anpassungen leicht umsetzbar zu machen.

      Wie funktioniert die Game Engine?

      Die Funktionsweise der Engine ist leicht verständlich. Es wird immer nur eine Szene aktiv gerendert. Jede Szene kann eine beliebige Anzahl von Layern haben, zu denen dann Spielelemente hinzugefügt werden können. Diese können Sprites, 3D-Objekte oder auch leere Elemente sein. Jedes dieser Spielelemente nimmt wiederum Komponenten auf, die als "GameBehaviors" bezeichnet werden und mit denen die Logik des Spiels implementiert werden kann. Wie auch bei anderen Klassen in der Engine können eigene GameBehaviors oder sogar ganze Spielelemente mithilfe abstrakter Klassen erstellt werden. Genesis wird standardmäßig mit einer Sammlung der wichtigsten Elemente geliefert.

      Wie wird die aktive Szene gerendert?

      Derzeit gibt es ein Renderer, OpenGL 4.5, das mit DirectX 11 vergleichbar ist. Es können jedoch auch eigene Renderer erstellt werden. Die Integration von Vulkan und DirectX 12 ist für die Zukunft geplant. Als 3D-Format werden derzeit Wavefront-Dateien unterstützt. Dank der Game-Klasse, die Initialisierung, Rendern und Laden der Szene übernimmt, musst du dir keine weiteren Gedanken über das Rendern machen, sofern du dies nicht möchtest.

      Wie wird die Physik des Spiels behandelt?

      Die Physik wird über sogenannte PhysicHandler übernommen. Derzeit gibt es einen PhysicHandler3D und einen PhysicHandler2D, der mit BulletSharp, einem Bullet Physics Wrapper, die Physik innerhalb der Spielwelt simuliert. Wie auch bei den Renderern und Spielelementen können eigene PhysikHandler erstellt werden.

      Welche Arten von Spielen können mit Genesis gemacht werden?

      Derzeit können sehr gut 2D-Spiele aller Genres erstellt werden. 3D wird zum aktuellen Zeitpunkt noch nicht vollständig unterstützt; es fehlen Animationen, das Laden von FBX-Objekten sowie eine effiziente Möglichkeit, Schatten zu implementieren. Bei Letzterem gibt es bereits mehrere Ansätze, und es wird eines der nächsten Features sein.

      Welche 3D-Funktionen existieren bereits?

      Im 3D-Bereich funktioniert bereits das Laden und Rendern von Wavefront (.obj) Dateien sowie die Grundlagen der Physiksimulation (Kollisionen, Raycasts).

      Wie werden Assets ins Spiel geladen?

      Texturen und Schriftarten können einfach in den Ressourcenordner gelegt werden, der dann automatisch geladen wird. Beachte bitte, dass du, wenn du sie in den Ressourcenordner in Visual Studio kopierst, einstellen musst, dass sie beim Build kopiert werden. Mithilfe des Asset Managers kannst du dann darauf zugreifen oder auch die Texturen als Archiv verpacken, sodass du die RAR-Dateien nicht mit dem Projekt mitliefern musst.

      Welche externen Libraries benutzt Genesis?

      Genesis selbst verwendet Open-Source-Bibliotheken wie glmSharp, bulletSharp, NetGL und den OpenObjectLoader. Die einzelnen Lizenzen kannst du im License-Ordner einsehen.

      Roadmap:
      • Implementieren von Schatten (3D)
      • Implementieren von Animationen (3D) Implementiert mit v. 1.1.2
      • Hinzufügen von weiteren UI Elementen (2D/3D)
      • Hinzufügen von OpenAL (Sound)
      • Bug Fixes
      • 2D Szenen Editor
      • 3D Szenen Editor
      Screenshot(s):


      Verwendete Programmiersprache(n) und IDE(s):
      Visual Studio 2022 | C++ / C#

      Systemanforderungen:
      .Net Framework 4.5

      Systemveränderungen:
      Keine Veränderungen

      Download(s):
      github.com/Andy16823/GFX/tree/main/GFX/GFX 0.1.0.0

      Beispiele:
      github.com/Andy16823/GFX/tree/main/Examples

      Lizenz/Weitergabe:
      MIT Lizenz
      Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

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

      Macht es da nicht mehr Sinn, einfach die Monogame-Repo zu forken und diese um die erwähnten Collision-Solver zu ergänzen? Habe mir mal das Sample angeguckt, finde aber den Framework-Ansatz von XNA/Monogame gelungener.
      Eventuell wäre es einfach besser, wenn man von einem Interface erben kann, welche Methodenimplementierungen wie OnInit, OnRenderEnd erzwingt. Ansonsten schöne Engine. Ein nützliches Szenario sehe ich in der Integration von hardwarebeschleunigtem Rendering in WindowsForms-Anwendungen. Schätze man könnte statt des Fenster-Handles, einfach bspws. den Panel-Handle übergeben und dann seine UI wie gewohnt konstruieren.
      Und Gott alleine weiß alles am allerbesten und besser.

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

      Hallo, ja genau, du kannst jedes handle übergeben, egal ob Panel oder Window. Habe mich damals bewusst für diesen Aufbau entschieden, da ich ihn logischer fand. Wobei das auch schon 10 Jahre oder mehr her ist.
      Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

      Update 0.1.0.1

      Ich habe soeben das Update auf die Version 0.1.0.1 hochgeladen. Die wohl größte Neuerung in diesem Update ist, dass ich das laden von 3D Modellen nun mit AssimpNet Realisiere. Dies war ein wichtiger Schritt, gerade in Richtung Animationen. Da es mit AssimpNet möglich ist auch FBX und andere Formate zu laden. Aktuell habe ich nur die Formate .fbx und .obj getestet. In der Theorie können mit Assimp noch mehr Formate geladen werden, diese muss ich noch genauer testen. Außerdem wurde ein Bug der Collider gefixt, welche einen Gimbal Lock hatten.

      Changelog
      • Implemtierung von AssimpNet
      • FBX Support hinzugefügt
      • Gimbal Lock beim Collider gefixt
      • Anpassungen an dem Element3D
      • Anpassungen an der Mesh Klasse
      • Material Klasse hinzugefügt

      FBX Export Einstellungen in Blender
      Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

      Ich habe nun auch eine kleine Website für das Projekt angelegt. Bitte beachtet, dass diese noch WIP ist. Es befindet sich allerdings ein Getting Started Guide dort und weitere Content zu der Engine wird dort folgen um den Beitrag möglichst sauber zu halten.

      Die Website ist hier zu erreichen gfx.676-games.de/
      Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

      Moin Andy!

      Ich glaube hier ist ein besserer Ort für Feedback, als in deinem Fragethema :)

      Meine Anmerkung zum Plesk kannst du von dort allerdings gerne mitnehmen, ich halte nichts von doppelter Datenhaltung :D

      Ich schaue mir gerade deinen Quellcode an und was mir aufgefallen ist, ist dass du z.B. Equals selten (oder gar nicht, wenn ich mich nicht verguckt habe) überlädst.
      Du könntest dann noch == und != überladen.

      Ansonsten muss ich sagen, finde ich den Code bisher sehr sauber und strukturiert!
      Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

      Meine Firma: Procyon Systems

      Selbstständiger Softwareentwickler & IT-Techniker.
      Update 0.1.1.2: Animationen, 2D-Partikel & 3D-Physikverbesserungen

      Es war eine Weile lang ruhig um das Projekt, jedoch bedeutet das nicht, dass in dieser Zeit nichts passiert ist.
      Mit dem Update 0.1.1.2 kommen einige interessante Features in die Engine.

      2D-Partikel-Emitter
      Dokumentation: Class ParticleEmitter | GFX (676-games.de)

      Zum einen gibt es ein neues Element namens Partikel-Emitter, der, wie der Name schon sagt,
      Partikel erzeugt und verwaltet. Der Partikel-Emitter nutzt instanced rendering, was bedeutet,
      dass mit nur einem Draw Call bis zu 1000 oder sogar mehr Partikel gerendert werden können,
      die sich sowohl in Position, Größe, Rotation und Farbe unterscheiden. Außerdem können die
      Partikel mit Alpha-Texturen versehen werden, was dazu führt, dass die Form der
      Partikel individuell angepasst werden kann.

      Beispiel Code

      C#-Quellcode

      1. ParticleEmitter particles = new ParticleEmitter("Particles", new Vec3(10, 100, 0), Vec3.Zero(), new Vec3(40, 40), m_game.AssetManager.GetTexture("5.png"));
      2. particles.ParticleDistance = 150;
      3. particles.CreateParticles(50, new Vec3(15, 15));
      4. scene.AddGameElement("ObjectsLayer", particles);



      Video: streamable.com/2o7jmm

      Animationen mit dem Model-Element
      Dokumentation: Class Model | GFX (676-games.de)

      Das wohl interessanteste Feature sind jedoch die 3D-Animationen. Zuvor war es bereits möglich,
      mit dem Element3D-Element 3D-Modelle zu rendern. Jedoch waren diese Modelle immer nur statisch,
      und ja, ein 3D-Spiel konnte man bislang damit noch nicht mit GFX erstellen. Mit diesem Update
      wurde nun der Grundstein gelegt, dass es nun auch möglich sein wird, 3D-Spiele zu erstellen.

      Dafür wurde ein weiteres Element hinzugefügt, das Model. Das Model-Element kann derzeit nur
      für 3D-Modelle genutzt werden, die über ein Rig und Animationen verfügen. Für statische Elemente,
      die dies nicht haben, kann weiterhin das Element3D genutzt werden. Mit einem späteren Update
      wird es jedoch auch möglich sein, dass Modelle ohne Rig und Animationen damit dargestellt werden können.

      Getestet wurden die Formate FBX und DAE für Animationen. Bei FBX müssen die Texturen mit blender extrahiert werden
      und in das Ausgabe Verzeichnis kopiert werden.


      Beispiel Code

      C#-Quellcode

      1. var model = new Model("Vampire", new Vec3(-1f, -1f, -1f), modelspath + "\\Vampire\\vampire.dae");
      2. model.AnimationSpeed = 0.02f;
      3. model.Size = new Vec3(0.7f);
      4. model.PlayAnimation("");
      5. baseScene.AddGameElement("BaseLayer", model);



      Video: streamable.com/c0ybjl

      Third-Person-Character-Controller & Physik
      Dokumentation: Klasse ThirdpersonCharacterController | GFX (676-games.de)

      Da es nun möglich ist, Animationen abzuspielen, sollte es nun auch möglich sein, sich mit einem Charakter durch die Szene zu bewegen.
      Daher habe ich den ThirdPersonController als Behavior hinzugefügt. Hierbei habe ich einige Fehler in der 3D-Physik bemerkt,
      welche ich behoben habe.

      Beispiel Code

      C#-Quellcode

      1. // Create the player model with an Capsule Collider and check for collisions.
      2. Model model = new Model("Character", new Vec3(2f, 2f, 0f), modelspath + "\\Assets\\Animation\\Human.fbx");
      3. model.PlayAnimation("Armature|idle");
      4. scene.AddGameElement("BaseLayer", model);
      5. var controller = model.AddBehavior(new Genesis.Core.Behaviors._3D.ThirdpersonCharacterController());
      6. controller.CreatePhysics(physicsHandler, new Vec3(0f, 0.75f, 0f), 0.5f, 0.5f, 50f);
      7. controller.RunAnimation = "Armature|run";
      8. controller.IdleAnimation = "Armature|idle";



      Video: streamable.com/yqxwmv
      Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

      Andy schrieb:

      modelspath + "\\Assets\\Animation\\Human.fbx"


      Ich hatte auch mal mit DirectX12 so ein Projekt begonnen, hab da einiges drin gehabt. Aber an eines habe ich nicht gedacht. Nutzung von kommerziellen Assets durch User der Engine. Wenn man die Assets so verwendet, könnten Spieler von Spielen die mit deiner Engine gemacht wurden, einfach so die Modelle klauen. Ich hab mittlerweile einen großen Haufen gekaufte Assets(UE Market), ich glaub keines davon dürfte ich so in deiner Engine nutzen(lässt sich ja alles aus dem UE-Editor exportieren), weil das vermutlich gegen die Lizenz(in Sachen weiterverbreitung) verstoßen könnte. Um so ein Problem zu vermeiden, könntest du wie bei der UE auch, "Kochen". Cooked Content, so das keiner einfach so die Modelle/Texturen etc... kopieren und nutzen kann. Lass dich dazu evtl. mal vom Fachman beraten und bau sowas frühzeitig ein. Ich hatte das nicht, hätte die ganze Struktur ändern müssen, so das ein Rewrite besser gewesen wäre. Da hab ich as dann verworfen und dachte mir, das ist es nicht Wert. War eine gute Entscheidung, bin richtig happy mit der UE.
      Zitat von mir 2023:
      Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

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

      Da hast du recht. Ich habe die Idee, einen "Converter" zu entwickeln, der Formate in ein internes Format umwandelt, das zusätzlich verschlüsselt werden kann. Ich verwende bereits eine ähnliche Funktion in meinem Backup-Tool, um die Backups etwas sicherer zu machen.
      Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

      Ja so kann man das machen. Ich hatte zu der Zeit auch noch reichlich überlegt, wie ich das umsetzen könnte bevor ich das Projekt eingemottet hab. Ein Import-Tool hatte ich erst vor zu machen, dann dachte ich beim Kompilieren einzugreifen, selbst Code zu generieren(wie mit den Macros der UE, bei C++ Projekten), bzw. dort das Packen einzubauen, so das User der Engine sich darum nicht selbst kümmern müssen. Aber ob sich sowas mit C# machen lässt kann ich dir so nicht sagen, kann es mir aber vorstellen.

      PS:
      Eine Suche via Google brachte mir das folgendes, ich glaube das ist besser als wenn User selbst packen müssen. Also neuen Code aus alten Code generieren, der dir das packen erledigt und dann auch die gepackte Datei zur Laufzeit lädt.
      Das läuft so auch auf ein eigenes Dateiformat hinaus.
      https://devblogs.microsoft.com/dotnet/introducing-c-source-generators/



      PPS. @Andy
      Hatte eben noch eine Idee. Die Assets nicht im Ausgabeordner haben, ein weiterer Parameter "optional bool pack = true", wenn pack == true, das Assets aus einem Ordner auf Projektebene(nicht Ausgabeordner) laden, kompilieren(dein Format) und das in die Ordnerstruktur der Ausgabe packen und nutzen.
      Zitat von mir 2023:
      Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

      Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „DTF“ ()

      Heute habe ich die Beta-Branch mit der Main-Branch auf GitHub gemerged und einen neuen Release erstellt. Dieser enthält folgende neue Funktionen:
      • 3D Animation (bereits in der Beta-Branch vorhanden)
      • 2D Partikel Emitter (ebenfalls schon in der Beta)
      • Third Person Character Controller (ebenfalls schon in der Beta)
      • 2D Lightning mit Screenspace Maps
      • 2D Pathfinding mit A* und dem NavMesh-Element
      • SRGB Farbraum- und Gamma-Korrekturen
      • Überarbeitung des Materialsystems
      • 3D Shapes, die mit Materialien versehen werden können
      • Assimp für das Laden von FBX, OBJ, DEA und GLTF Modellen (ebenfalls in der Beta)
      Zusätzlich haben wir:
      Wie ihr sehen könnt, enthält der neue Stable Build einige bekannte Funktionen aus der Beta sowie einige komplett neue Features. In den kommenden Wochen ist mein Ziel, eine Community rund um die Engine aufzubauen und vielleicht auch den ein oder anderen zu finden, der Lust hat, aktiv am Projekt mitzuwirken. Ich würde mich freuen den ein oder anderen für das Projekt begeistern zu können, es ist mein derzeit größtes und umfangreichstes Projekt welches seinen Anfang bereits schon vor mehr als 10 Jahren mit der ersten damals noch in Java erstellten Version fand.
      Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

      Release der .Net 8 Version :)

      Hallo :)

      ich habe mich die letzten tage intensiv damit beschäftigt das Projekt in Richtung .Net 8 zu portieren um einfach ein klein wenig mehr Sicherheit für die Zukunft zu haben. Dies bedeutete aber auch, dass ich einige Projekte wie BulletSharp und GlmSharp selbst upgraden musste, da diese nicht für .Net 8 verfügbar waren. Ich habe nun die erste Version veröffentlicht. Welche nach meinen Tests bereits sehr gut funktioniert. Außerdem beinhaltet die .Net 8 Version die neuen Collidern. In der Net Framework version werden diese in den kommenden tagen folgen.

      Ich werde außerdem die .Net Framework Version parallel zu der .Net 8 Version weiter entwickeln, da der aufwand für dies recht wenig sein sollte, da ja vieles gleich funktioniert. Ziel war es einfach für die Zukunft gewappnet zu sein und nicht in 2-3 Jahren ein wesentlich umfangreicheres Projekt zu portieren. Nach dem Motto "wer nicht mit der zeit geht geht mit der zeit".

      Ich habe das ganze in ein eigenes Repository gepackt, welches ihr hier finden könnt: github.com/Andy16823/GFX-Net-Core außerdem ist hier ein kleiner Leitfaden wie ein Projekt damit erstellt werden kann: forum.gfx-engine.org/showthread.php?tid=5
      Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

      Kurzes Update zur Projektentwicklung: Nach den letzten Änderungen habe ich nun mit der Entwicklung eines Level-Editors begonnen. Dieser ist zwar nicht so aufwendig gestaltet wie die Editoren anderer Engines, jedoch liegt mein Fokus momentan darauf, eine funktionale Entwicklungsumgebung bereitzustellen. Insgesamt verläuft die Entwicklung sehr gut. Es ist bereits möglich, mithilfe eines Raycast-Systems Entitäten in der Szene anzuklicken und sie durch ein Transform-Gizmo zu verschieben.

      Für das Picking gibt es grundsätzlich zwei Ansätze: Zum einen kann man die Szene ein zweites Mal auf einem separaten Framebuffer rendern und jedem Element eine spezifische Farbe als ID zuweisen. Wenn ich dann mit der Maus auf den Bildschirm klicke, werden die Pixeldaten des zweiten Framebuffers überprüft und das entsprechende Objekt anhand des Pixels identifiziert. Ich bevorzuge jedoch den zweiten Ansatz, da die Engine ohnehin eine Physik-Engine (Bullet) verwendet, die Raycasting unterstützt. Dies hat den Vorteil, dass detaillierte Informationen über die Treffer ermittelt werden können. Zudem ist Raycasting ein wesentliches Werkzeug in der Spieleentwicklung.

      Ihr könnt mir ja gerne vorschläge machen, welche Funktionen der Level Editor besitzen sollte. Außerdem gibt es auch schon einen ersten Screenshot.
      Bilder
      • Screenshot 2024-08-12 142637adaw.png

        2,01 MB, 1.920×1.032, 52 mal angesehen
      Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

      Ich sehe keine Einrastfunktion, also wenn man was mit dem Gismo bewegt(alle N Einheiten). Ein unheimlich nützliches Feature wäre das, auch bei Rotationen und Skallierungen. So ein ContentDrawer, ausdem du Objekte einfach auf den Viewport ziehen kannst um sie hinzuzufügen, wäre doch auch ganz nett. Falls du das noch nicht gemacht hast, teste die Software der Konkurenz. Erstell wenn du kannst mit der UE 5.4 z.B. mal eine kleine Welt, dann wirst du merken welche Features die Konkurenz hat und wie nützlich sie sein können.

      Ein Sache die vielen das leben erleichtern würde, automatisiertes Texturetiling. So das man nicht die Wiederholungen der Texture sieht, falls du nicht weist was ich meine, schau nach Bildern bei Google("hide texture tiling"). Ich habe Stunden damit verbracht in der UE Landschaftsmaterialien zu machen, sowas könnte man sicher auch automatisieren(mit anpassbaren parametern). Das würde auch deutlich schönere Ergebnisse liefern, gerade bei Anfängern die keine große Auswahl an Assets haben und keine Ahnung haben wie man es denn richtig macht.
      Zitat von mir 2023:
      Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
      Ja die Einrastfunktion habe ich tatsächlich noch nicht drinnen. Es gibt in dem Tab (wo die properties sind) einen weiteren Tab mit der Projekt Hierarchie. Von da kann man ganz einfach Elemente in die Szene droppen. Was sonst noch nett wäre, dass wenn man Shift gedrückt hält und dann das Gizmo bewegt ein Duplikat von dem Ausgewählten Element erstellt wird. Aktuell habe ich Collisionsgruppen und Masken Implementiert. Die Gruppe ist Praktisch die Gruppe wo das Element dazugehört und die Maske ist eine Liste von Gruppen mit welchen das Element kollidieren kann.



      Hat zwar nicht viel mit dem Editor zu tun. Bin jedoch durch ein Problem darauf gekommen, dass ein solches System extrem hilfreich wäre. Da ich sonst das Problem hatte, das mein Raycast für das Gizmo auch normale Elemente treffen kann. Diese können ganz einfach zugewiesen werden

      C#-Quellcode

      1. var element3D = new Element3D("sprte", "Resources/Models/Guitar/Guitar.fbx", new Vec3(0, 0f, 0f), Vec3.Zero(), new Vec3(1f, 1f, 1f));
      2. var collider = element3D.AddBehavior<BoxCollider>(new BoxCollider(physicsHandler));
      3. collider.CreateCollider(element3D.Size.Half(), (int)CollisionGroup.StaticObject, CollisionGroup.StaticObject.GetCollisionMask());


      und dann z.b. so in einem Raycast gefiltert werden

      C#-Quellcode

      1. var gizmoResult = Raycast.PerformCastFiltered(Camera, Viewport, PhysicsHandler, e.X, e.Y, (int) CollisionGroup.EditorEntity, CollisionGroup.EditorEntity.GetCollisionMask());


      Ist schon spannend zu sehen wie sich dieses Projekt entwickelt hat. von einer 2D "Engine" mit Java und dem Graphics2D context zu einer 2D und 3D Engine mit OpenGL 4.5 so das sie selbst auf Wikipedia zu finden ist auf der deutschen Bullet Seite de.wikipedia.org/wiki/Bullet_(Physik-Engine)
      Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

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

      Ja, macht sich deine Engine. Ich trauere meiner noch hinterher. Ich hab mir schon unzählige male überlegt eine kleine Engine für Android zu machen mit dem NDK(weil die UE so dicke APKs raushaut, schnell zu groß für den Playstore), aber der Faktor Zeit spricht dagegen.
      Zitat von mir 2023:
      Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
      Ich habe nun auch die ersten Schatten für statische 3D Objekte in das Spiel implementiert.



      Gibt zwar noch 1-2 Probleme aber ich denke es ist auf einem gutem weg :)
      Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener