Sharpex2D 1.3.0 | 2D Game Framework

    • Beta
    • Open Source

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

      ThuCommix schrieb:

      Außerdem könnte ich wetten, das ob ich nun einen Kreis zeichne, oder eine Textur mit einen Kreis habe, die Performance in etwa gleich sind.
      Nicht in GDI+. :P GDI wird langsam wie Sch*** wenn du anfängst viele Bitmaps zu zeichnen, und genau das tust du, wenn du alles mit Bitmaps zeichnest. bei DirectX ist Texturedrawing natürlich über die Grafikkarte optimiert, da wirds wahrscheinlich wirklich keinen Unterschied machen.

      Aber nur mal angenommen du willst ne einfache Linie von einem Punkt zum anderen Zeichnen, die Punkte sind aber Variabel, da will ich mal sehen, wie du das mit ner Textur realisierst. Du müsstest sie drehen und zerren, was ein haufen Arbeit ist und nochmal extra Performance kostet (und das Ergebnis wird nicht so toll, weil gezerrte Bitmaps immer einen Qualitätsverlust aufweisen).
      Jo, das Problem mit den Arcs... das ist und bleibt aber auch bis jetzt das einzige, was nicht funktioniert, alles andere konnte ich schon recht gut "zusammentricksen". ;) Grundsätzlich bietet Direct2D ja alle Funktionen von GDI+, das ganze in Direct3D zu implementieren wäre aber natürlich ne ganz andere Hausnummer, da möchte ich lieber gar nicht drüber nachdenken.
      Ist ja deine Sache, wie du deine Engine gestaltest, ich wollte das nur mal so sagen. :)
      Aktualisierung auf Version 0.1.537

      Changelog:

      github.com/ThuCommix/Sharpex.G…eLibrary-0.1.519...master


      Neues im Überblick:

      - Geometrische Figuren ohne Textur rendern
      - Matrizen
      - GameTimer & PrecisionTimer
      - Erweiterbares Contentloading
      - Verbessertes Surface handling system
      - SGLInitializer benötigt nun ein Form Handle.



      Habt ihr noch Ideen, was eurer Meinung nach in eine 2D GameEngine gehört? - Schreibt's doch hierher :)
      Hallo ThuCommix,

      ich bin Student und arbeite an einem simplen Pong und bin auf Deine Engine gestoßen. Das Pong wollen wir später einmal mit einem Leap Motion Controller steuern.
      Ich hab auch bereits die ersten Ansätze, allerdings tun sich einige Fragen auf die ich Dir gerne stellen würde. Man kann Dir ja leider keine privaten Nachrichten schreiben, da Du nur Freunde auf Dein Forenprofil lässt und letzte Woche Donnerstag hast Du mich bereits als Forenfreund abgelehnt.. :S

      Aufjedenfall hier die Probleme auf die ich (bzw. wir, da ich mit einem Kollegen daran arbeite) gestoßen bin:

      1. Wenn man 2 (oder auch mehr, je nach Spiel) Spieler für Pong implementieren will, muss man 2 oder mehr verschiedene Klassen machen, also eine Klasse für jeden Spieler, da das InputHandling in der Spielerklasse übernommen wird.

      2. Wenn man 2 Spieler durch 2 verschiedene Klassen implementiert, kann man nur einen Spieler gleichzeitig bewegen. Liegt das am Tick oder am InputHandler?

      3. Wenn man ein Objekt bewegen will und eine Taste für eine konstante Bewegung gedrückt hält, gibt es ein kurzes Delay. Es bewegt sich einmal kurz (wahrscheinlich der erste Tick der die Bewegung erkennt) und danach wartet er kurz, bevor er in eine konstante Bewegung übergeht.

      4. Wie hoch ist die TickRate? Kann man sie irgendwie verändern? Wenn ja, macht das überhaupt Sinn? :D

      5. Die Maus verschwindet, wenn man mit ihr ins Rendering Fenster geht. Kann man die Maus irgendwie einblenden lassen?

      6. Gibts eine einfache Funktion für eine Art Vollbildmodus oder hängt das von der Form an die ich benutze?

      7. Wie funktioniert die Kollision in der Engine? Gibt leider keine bzw. sehr wenig Dokumentation und da ich und mein Kollege aus Java kommen und auch generell noch nicht soo viel Erfahrung mit C# gesammelt haben, stoßen wir da auf einige Verständnisprobleme. Da wir auch nur sehr wenig Wissen darüber haben, wie so eine Engine generell funktioniert, wirds für uns nur doppelt schwer. :D Unser einzige Ansatz ist bisher jedem Objekt ein Rectangle zu geben was so groß ist wie seine Textur (width & height) und dann über BruteForce alle Objekte durchzutesten mit der Intersects Methode.

      Wäre super, wenn Du mich als Freund im Forum akzeptieren würdest oder wir uns über E-Mail unterhalten könnten, falls wir zukünftige Fragen haben sollten. Wär super nett. :)

      Gruß,
      Dennis
      @hurt
      Hast du dir die Tutorials schon angeschaut? Wenn nicht, hier ist der Link :[C#] [Sharpex.GameLibrary] Tutorialübersicht
      1. Wenn man 2 (oder auch mehr, je nach Spiel) Spieler für Pong implementieren will, muss man 2 oder mehr verschiedene Klassen machen, also eine Klasse für jeden Spieler, da das InputHandling in der Spielerklasse übernommen wird.


      Das ist richtig, Player1 und Player2, die jeweils auf verschiedene Tasten hören.

      2. Wenn man 2 Spieler durch 2 verschiedene Klassen implementiert, kann man nur einen Spieler gleichzeitig bewegen. Liegt das am Tick oder am InputHandler?


      Habt ihr für Spieler zwei verschiedene Tasten benutzt? Tritt das Problem auf, wenn beide gleichzeitig einen Input machen?

      3. Wenn man ein Objekt bewegen will und eine Taste für eine konstante Bewegung gedrückt hält, gibt es ein kurzes Delay. Es bewegt sich einmal kurz (wahrscheinlich der erste Tick der die Bewegung erkennt) und danach wartet er kurz, bevor er in eine konstante Bewegung übergeht.


      Das muss ich mal testen, werde wahrscheinlich den InputListener nochmal überarbeiten..

      4. Wie hoch ist die TickRate? Kann man sie irgendwie verändern? Wenn ja, macht das überhaupt Sinn? :D


      Das kannst du im SGLInitializer einstellen, der hat eine Eigenschaft, wieviele FramesPerSecond dein Spiel haben soll. 1000 / FramesPerSecond sind dann deine Ticks. Standardmäßig ist das auf 60FPS eingestellt, ich glaube niedriger Werte haben nur Sinn, wenn im Spiel eh nicht viel passiert (Effektmäßig, oder flüssige Bewegungen)

      5. Die Maus verschwindet, wenn man mit ihr ins Rendering Fenster geht. Kann man die Maus irgendwie einblenden lassen?


      Jap, die musst du selber zeichnen, such dir einfach eine Textur raus, die als Maus fungieren soll.

      6. Gibts eine einfache Funktion für eine Art Vollbildmodus oder hängt das von der Form an die ich benutze?


      C-Quellcode

      1. SGL.Components.Get<GraphicsDevice>().DisplayMode.Scaling = true; //Grafiken werden gesized
      2. SGL.Components.Get<RenderTarget>().SurfaceControl.SetWindowStyle(SurfaceStyle.Fullscreen); //fullscreen


      7. Wie funktioniert die Kollision in der Engine? Gibt leider keine bzw. sehr wenig Dokumentation und da ich und mein Kollege aus Java kommen und auch generell noch nicht soo viel Erfahrung mit C# gesammelt haben, stoßen wir da auf einige Verständnisprobleme. Da wir auch nur sehr wenig Wissen darüber haben, wie so eine Engine generell funktioniert, wirds für uns nur doppelt schwer. :D Unser einzige Ansatz ist bisher jedem Objekt ein Rectangle zu geben was so groß ist wie seine Textur (width & height) und dann über BruteForce alle Objekte durchzutesten mit der Intersects Methode.


      Du deklarierst einen neuen CollisionManager (Namespace: Framework.Physic.Collision). Deinen Ball lässt du von Particle (Namespace: Framework.Physic) erben, und setzt als Shape Circle, den Radius musst du dann dementsprechend eurer Kugelgröße anpassen. Eure Schläger sind lasst ihr auch von Particle erben, das wären dann Rectangles. Dann kannst du mit:

      C-Quellcode

      1. var collisionManager = new CollisionManager();
      2. if(collisionManager.IsIntersecting(pongParticle, schlaegerParticle1))
      3. {
      4. //schläger 1 berührt pong
      5. }
      6. if(collisionManager.IsIntersecting(pongParticle, schlaegerParticle2))
      7. {
      8. //schläger 2 berührt pong
      9. }




      Wenn du noch Fragen hast, melde dich ruhig :)

      ThuCommix schrieb:

      Habt ihr für Spieler zwei verschiedene Tasten benutzt? Tritt das Problem auf, wenn beide gleichzeitig einen Input machen?


      Logischerweise haben wir für beide Spieler verschiedene Tasten benutzt. Spieler 1 benutzt W & S, während Spieler 2 Pfeiltasten Oben & Unten benutzt.
      Das Problem lässt sich folgendermaßen beschreiben: Wenn Spieler 1 S gedrückt hält (und sich sein Pongschläger nach unten bewegt) und dann Spieler 2 Pfeiltaste Oben oder Unten drückt und gedrückt hält, stoppt der Schläger von Spieler 1 seine Bewegung und der Schläger von Spieler 2 startet seine. Das ganze gilt auch andersherum. Eine Bewegung von 2 Objekten durch 2 verschiedene Tasten scheint nicht möglich zu sein.




      Du deklarierst einen neuen CollisionManager (Namespace: Framework.Physic.Collision). Deinen Ball lässt du von Particle (Namespace: Framework.Physic) erben, und setzt als Shape Circle, den Radius musst du dann dementsprechend eurer Kugelgröße anpassen. Eure Schläger sind lasst ihr auch von Particle erben, das wären dann Rectangles.


      Das ist schlecht.. Meine Struktur sieht bisher folgendermaßen aus:

      Entity

      PlayerEntity
      BallEntity

      Player und Ball erben von Entity, dann kann ich logischerweise nichtmehr von Particle erben lassen. Könnte man das nicht besser mit Interfaces realisieren als mit Vererbung? Wirft sonst meine ganze Struktur aus dem Fenster. :D
      Die Entityklasse enthält quasi alle Methoden die ein Objekt haben muss, wenn es gezeichnet werden soll. (bspw. move) Außerdem enthält sie alle Eigenschaften die ein derartiges Objekt haben muss. (Koordinaten, Geschwindigkeit, Textur, Höhe, Breite, etc. pp


      Hat sich erledigt, konnte natürlich einfach Entity von Particle erben lassen.. Erst denken, dann schreiben. :D

      Gruß,
      Dennis

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

      Da arbeiten wir uns gerad noch rein bzw. implementieren es. Ich melde mich wieder. Danke schonmal. :)


      Edit: Schon das erste Problem.. :huh:

      Wenn ich von Particle erbe, muss ich einen Konstruktur angeben, der einen IPhysicProvider als Parameter hat. Wenn ich dann allerdings ein Objekt von dem Typ erzeugen will, was muss ich ihm dann als PhysicProvider übergeben?

      Edit2: Soweit ich das verstehe muss ich für jedes Objekt einen PhysicProvider erstellen, der die Geschwindigkeit (Velocity) und ähnliches regelt. Allerdings verstehe ich nicht, wozu dann die subscribe und unsubscribe Methoden sein sollen.
      Oder bin ich hier völlig auf dem falschen Dampfer?

      Edit3: Hab gerad mal in den Quellcode vom PhysicProvider geschaut. Ein PhysicProvider enthält also mehrere Particle und regelt u.a. deren Geschwindigkeit (Velocity). Allerdings verstehe ich nicht, warum der PhysicProvider einen eigenen CollisionManager hat.
      Langsam glaube ich, dass der PhyiscProvider nur für Fälle wie Gravitation etc. programmiert wurde, dann versteh ich allerdings nicht, warum ich jedem Particle das ich erstelle im Konstruktor einen PhysicProvider übergeben muss?

      Gruß,
      Dennis

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

      @hurt:

      Ich bin der weile mal das Problem mit den Keyboard angegangen. Es war tatsächlich nicht möglich, long-press von mehreren Keys abzufragen. Ich habe das ganze System nochmal überarbeitet, nun sollte es möglich sein. In der Benutzung ändert sich für dich nichts.

      Sharpex.GameLibrary 0.1.537 Fixed Inputsystem


      Maus ein/ausblenden:

      C-Quellcode

      1. SGL.Components.Get<RenderTarget>().SurfaceControl.SetCursorVisibility(true); // o. false

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

      @ThuCommix:

      Kann es sein, dass Du den IGraphicRender in IRenderer umbenannt hast? Wir hatten anscheinend noch eine relativ alte Version von Deiner GameLibrary.

      Wir haben bereits alle IGraphicRenderer mit IRenderer ersetzt, allerdings funktioniert jetzt der Konstruktor vom SGL Initializer nichtmehr. Was hast Du da großartiges geändert? :D
      Wir haben bereits in GitHub geschaut, dort steht: "The Initializer now requires a window handle"
      Allerdings werden wir daraus nicht schlau, kannst Du uns da mal schnell auf die Sprünge helfen? :D

      Gruß,
      Dennis
      Oh, da habt ihr aber etwas richtig altes genommen..

      Früher hat SGL selbst ein Window erstellt, jetzt muss man selber eins angeben. Im Form Show Event eurer Startform also:

      C-Quellcode

      1. SGL.Initialize(new SGLInitializer(gameklasse, Handle);


      Handle ist eine Eigenschaft der Form.
      Hm jetzt haben wir das Problem, dass das Programm nicht beendet wird, wenn die Form geschlossen wird. Vielleicht solltest Du Deine Tutorials dementsprechend mal anpassen, weil ich finde nichts dazu.

      Die neue Library mit dem InputHandler scheint auch nicht zu funktionieren, es sei denn ich bin zu dumm eine Bibliotheksverweis richtig hinzuzufügen, was ich mir allerdings nicht vorstellen kann.

      Kanns sein, dass Du ausversehen die falsche Datei hochgeladen hast? Habe jetzt Deine Verlinkung von Freitag getestet und die Version über den NuGet Paketmanager.

      Gruß,
      Dennis
      Ja mach ich dann gleich mal.

      Der Link ist immer die neueste Version, ich habe die Library noch mal aktualisiert und hochgeladen - Einfach den Link nochmal benutzen. Im Form Closing Event eurer Form muss nun:

      C-Quellcode

      1. SGL.Shutdown();


      Was funktioniert am InputManager nicht?


      EDIT: In der nächsten Version wird das manuelle beenden nicht mehr nötig sein. Check surface availability

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