2d JnR Demo

    • Release
    • Open Source

    Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Trade.

      2d JnR Demo

      Name:
      2d JnR "NameNotKnown"

      Beschreibung:
      Hey Forum, hier möchte ich euch mal mein kleines 2d Jump n Run vorstellen. Dieses ist in C# geschrieben, und verwendet zum zeichnen GDI+.Die verwendeten Grafiken stammen von AlexiBexi (Youtube: youtube.com/user/AlexiBexi und Forum: http://alexibexi.de/). Da ich die Arbeit an diesem Projekt (Alexibexi Game) eingestellt habe, aber dennoch lust habe, evtl ein anderes 2d JnR basierend auf diesem (andere Grafiken & co) zu machen, suche ich auch noch nach Leuten die mir evtl helfen würden. Und es wäre sehr cool wenn sich auch die ein oder anderen mal den Code anschauen könnte, denn ich würde gerne mal wissen wie ihr den findet. (Ist nach und nach so zusammen gewachsen, also nicht zu erschrocken sein :P)
      Zur Steuerung, da findet ihr in der Zip selbst eine Anleitung :)

      Features:
      - flüssig (bei mir bis zu 100fps)
      - Eigene Level & Sprites
      - Gegner
      - Lebens & Kamp System

      Screenshot(s):
      GIF in übergröße (sorry) im Anhang

      Verwendete Programmiersprache(n) und IDE(s):
      Visual Studio 2013 Express
      C# .Net FW 4.5

      Systemanforderungen:
      .Net FW 4.5

      Systemveränderungen:
      Der Mapeditor speichert Test Maps im tmp Verzeichniss

      Download(s):
      Anhang,
      Source auch im Anhang (leicht andere Version als die Demo, da ich noch eine Animations erstellungs Software
      einbauen wollte.)

      Lizenz/Weitergabe:
      Creative Commons Lizenz
      Bilder
      • DevState.gif

        15,49 MB, 608×400, 320 mal angesehen
      Dateien

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

      Moin,

      ich habe es mal ausgetestet. Ganz nett.
      Ich habe noch ein paar Kritikpunkte:
      • Wenn man an gewissen Stellen ist, bewegt sich der Content der Map ja automatisch beim Laufen. Wenn man dort auf der Stelle nur ganz kurz A oder D drückt, ohne sich wirklich fortzubewegen, zuckt das so ein wenig hin und her. Das ist etwas unschön.
      • Polygone sind in diesem Spiel unumgänglich. Zum Einen sieht es besser aus, als so: fs2.directupload.net/images/150621/ofn9b6ek.png - Zum anderen ist es an einigen Stellen nämlich unmöglich, vorbeizukommen, ohne zu sterben: fs2.directupload.net/images/150621/y5klqwqj.png - Der Grund: Man könnte zwar über Monster springen, aber da der Collider mit Rectangles arbeitet, bekommt man trotzdem Gesundheit abgezogen.
      • Nach ein paar neuen Versuchen kommt diese Exception und die Zeichenfläche zeigt invalid:

        Spoiler anzeigen
        Informationen über das Aufrufen von JIT-Debuggen
        anstelle dieses Dialogfelds finden Sie am Ende dieser Meldung.

        ************** Ausnahmetext **************
        System.InvalidOperationException: Die Auflistung wurde geändert. Der Enumerationsvorgang kann möglicherweise nicht ausgeführt werden.
        bei System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
        bei System.Collections.Generic.List`1.Enumerator.MoveNextRare()
        bei System.Collections.Generic.List`1.Enumerator.MoveNext()
        bei AlexAdventure.Main.Main_Paint(Object sender, PaintEventArgs e)
        bei System.Windows.Forms.Control.OnPaint(PaintEventArgs e)
        bei System.Windows.Forms.Form.OnPaint(PaintEventArgs e)
        bei System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer)
        bei System.Windows.Forms.Control.WmPaint(Message& m)
        bei System.Windows.Forms.Control.WndProc(Message& m)
        bei System.Windows.Forms.ScrollableControl.WndProc(Message& m)
        bei System.Windows.Forms.Form.WndProc(Message& m)
        bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
        bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
        bei System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


        ************** Geladene Assemblys **************
        mscorlib
        Assembly-Version: 4.0.0.0.
        Win32-Version: 4.6.76.2 built by: NETFXREL2.
        CodeBase: file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll.
        ----------------------------------------
        AlexAdventure
        Assembly-Version: 1.0.0.0.
        Win32-Version: 1.0.0.0.
        CodeBase: file:///C:/Users/domin/Downloads/NameNotKnown/AlexAdventure%5BAlpha1%5D/AlexAdventure.exe.
        ----------------------------------------
        System.Windows.Forms
        Assembly-Version: 4.0.0.0.
        Win32-Version: 4.6.76.2 built by: NETFXREL2.
        CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll.
        ----------------------------------------
        System
        Assembly-Version: 4.0.0.0.
        Win32-Version: 4.6.76.2 built by: NETFXREL2.
        CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll.
        ----------------------------------------
        System.Drawing
        Assembly-Version: 4.0.0.0.
        Win32-Version: 4.6.76.2 built by: NETFXREL2.
        CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll.
        ----------------------------------------
        System.Core
        Assembly-Version: 4.0.0.0.
        Win32-Version: 4.6.76.2 built by: NETFXREL2.
        CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll.
        ----------------------------------------
        mscorlib.resources
        Assembly-Version: 4.0.0.0.
        Win32-Version: 4.6.76.2 built by: NETFXREL2.
        CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/mscorlib.resources/v4.0_4.0.0.0_de_b77a5c561934e089/mscorlib.resources.dll.
        ----------------------------------------
        System.Windows.Forms.resources
        Assembly-Version: 4.0.0.0.
        Win32-Version: 4.6.76.2 built by: NETFXREL2.
        CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms.resources/v4.0_4.0.0.0_de_b77a5c561934e089/System.Windows.Forms.resources.dll.
        ----------------------------------------

        ************** JIT-Debuggen **************
        Um das JIT-Debuggen (Just-In-Time) zu aktivieren, muss in der
        Konfigurationsdatei der Anwendung oder des Computers
        (machine.config) der jitDebugging-Wert im Abschnitt system.windows.forms festgelegt werden.
        Die Anwendung muss mit aktiviertem Debuggen kompiliert werden.

        Zum Beispiel:

        <configuration>
        <system.windows.forms jitDebugging="true" />
        </configuration>

        Wenn das JIT-Debuggen aktiviert ist, werden alle nicht behandelten
        Ausnahmen an den JIT-Debugger gesendet, der auf dem
        Computer registriert ist, und nicht in diesem Dialogfeld behandelt.



      Zum Source:
      • Deine Naming Conventions sind nicht wirklich guidelinekonform. Schau mal bei MSDN nach denen.
      • Du verstößt gegen das Prinzip der Kapselung und der OOP, da Du öffentliche Variablen benutzt.
      • Ich würde Enumerationen nicht alle in eine Klasse Enums packen, sondern einzeln für jede eine Datei machen.
      • Es fehlt ein ordentlicher GameLoop und eine gescheite zentrale Verwaltung aller Komponenten. Stattdessen wird ein einfacher Timer in einer Form benutzt, in dem wirklich alles gemacht wird. Man bräuchte da mehr Abstraktion. Das heißt abstrakte Klassen bzw. gar Interfaces, die implementiert werden und Methoden (etc.) bereitstellen, darunter Draw/Render und Update. Es werden also pro Frame die Sachen geupdated und dann neu gerendert. Im Moment regelst Du das halt alleine über den Timer und Paint. Es werden die FPS ja auch einfach pro Paint-Aufruf inkrementiert. Mit gescheiter Implementierung könntest Du das jederzeit flexibel austauschen, es wäre einfacher wartbar und übersichtlicher. Dazu kommt, dass Timer da vmtl. nicht so performant sind.
      • (Geht auch auf das vorherige zurück): Es fehlen gewisse Sachen, wie Vector2 und GameTime (in Verbindung mit einem GameLoop). Somit hätte man mehr Möglichkeiten die Performance zu kontrollieren und zusätzlich könnte man nämlich den Objekten eine Velocity geben und Physik recht gut implementieren (s=v*t). Zwar ist Point auch zweidimensional, aber es fehlen halt gewisse Sachen, um weitere Sachen zu implementieren (Operatoren, Länge des Vektors (Magnitude) für Entfernungen etc.). Es ist natürlich die Frage, was Du inwiefern brauchst, aber generell als Ansporn. Du kannst Dir ja mal z. B. Sharpex2D anschauen, was da alles wie implementiert ist.


      Das sind aber zum Großteil nur Ideen der Verbesserung. Ob sich der Aufwand für ein einzelnes Spiel jetzt so wirklich auszahlt, bleibt Dir überlassen. Besser wäre es, da man das so macht, aber wie gesagt.
      Sonst hat die Idee aber sicher Potenzial und ist auch recht gut.

      Grüße
      #define for for(int z=0;z<2;++z)for // Have fun!
      Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

      Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
      Hey,
      vielen vielen Dank für deine sehr ausführliche Antwort, und fürs Testen!
      Dieser Fehler kam bei mir noch nie.. Muss ich mir mal anschauen woran das liegt.
      Ich bin auch der Meinung Polygone oder Pixel-genaue Kollisionen sollten sein, aber wie kann man das vernünftig und performant einbauen?
      Ich hatte mich vorher nie daran getraut, aber ich denke ich werde mich da mal ein wenig belesen. Hättest du oder evtl jemand anderes noch ein paar schöne Ressourcen dazu zum lernen?
      An sich ist das ganze so zusammen gewachsen. In meinem ersten test gab es Nichtmals eine Player Klasse dafür... :D
      Wie gestaltet man denn z.B. so eine Player Klasse gekapselt und OOP einhaltend? Auch dafür evtl Ressourcen / Beispiele?

      Danke, und schönen Abend noch ;)

      Grüße
      Marcel
      Polygone sind im Prinzip nur Ansammlungen von Vertices und sind valid, sobald mehr als 2 Punkte vorhanden sind.
      Dazu bräuchtest Du jedoch erstmal eine ausführliche Vector2-Klasse, da Du wirklich einige Funktionen brauchst.

      Ich denke, dass Du Dir das mal z. B. in Sharpex2D anschauen darfst/kannst: github.com/ThuCommix/Sharpex2D…Sharpex2D/Math/Polygon.cs - Dafür ist es ja OpenSource, das hatte auch ThuCommix mal bestätigt.

      Ansonsten kannst Du da auch mal sonst durchblättern und Dich inspirieren lassen. Auch evtl. XNA, aber das ist ungefähr vom Aufbau her das Selbe, denke ich.

      Eine Player-Klasse ist dann nur noch eine kleine Hürde. Du brauchst ja nur wichtige Daten wie eine Position, Textur und eben die Update- und Draw/Render-Methoden, die am Besten über ein Interface implementiert werden.
      OOP hälst Du schon ein, sobald eben die Variablen nicht öffentlich sind.

      Grüße
      #define for for(int z=0;z<2;++z)for // Have fun!
      Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

      Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!: