Sharpex2D 1.3.0 | 2D Game Framework

    • Beta
    • Open Source

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

      Ein Programm, mit dem man Kohlenstoffverbindungen malen konnte.
      #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 :!:
      Aktualisierung auf Version 0.2.200

      Changelog:

      github.com/ThuCommix/Sharpex2D…2.170...Sharpex2D-0.2.200

      Überblick:

      - Fixed Window not going into fullscreen
      [DXRenderer] - Support for stretching
      [DXRenderer] - Added DirectXTextureFactory
      [DXRenderer] - Made Clear buffer optional
      - UIManager implements IComponent and is accessable via Game class or SGL.Components
      - RenderTarget now allows to create its own surface
      - Empty initializer in MediaInitializer ( -> MediaInitializer.Empty())
      - Moved ContentStorage to Content/Storage
      - Fixed issue github.com/ThuCommix/Sharpex2D/issues/8
      - Fixed issue github.com/ThuCommix/Sharpex2D/issues/9
      - Fixed wrong rectangle initialization (coords where mixed up)
      - Added abstract NumericBox class as UI input control
      Hey, ich bekomme beim Ausführen meines Projektes folgende Fehlermeldung:
      ​Ein Ausnahmefehler des Typs "System.InvalidOperationException" ist in Sharpex2D.dll aufgetreten.
      Zusätzliche Informationen: Could not get the handle associated with the current process.


      Hab leider keine Ahnung woran das liegen könnte..
      Hier mal der verwendete Code:
      Spoiler anzeigen

      Program.cs:

      C#-Quellcode

      1. using System;
      2. using Sharpex2D;
      3. using Sharpex2D.Framework.Rendering.GDI;
      4. using Sharpex2D.Framework.Rendering.DirectX;
      5. using Sharpex2D.Framework.Media;
      6. using Sharpex2D.Framework.Media.Sound.Wave;
      7. using Sharpex2D.Framework.Surface;
      8. namespace Test
      9. {
      10. static class Program
      11. {
      12. [STAThread]
      13. static void Main ()
      14. {
      15. SGL.Initialize (new SGLInitializer (new MainGame (), RenderTarget.GetDefault ()));
      16. SGL.Run (new GdiRenderer (), new MediaInitializer (new WaveSoundInitializer ()));
      17. }
      18. }
      19. }


      MainGame.cs:

      C#-Quellcode

      1. using System;
      2. using Sharpex2D;
      3. using Sharpex2D.Framework;
      4. using Sharpex2D.Framework.Game;
      5. using Sharpex2D.Framework.Components;
      6. using Sharpex2D.Framework.Rendering;
      7. using Sharpex2D.Framework.Surface;
      8. namespace Test
      9. {
      10. public class MainGame : Game
      11. {
      12. public MainGame ()
      13. {
      14. }
      15. #region implemented abstract members of Game
      16. public override void OnInitialize ()
      17. {
      18. SGL.Components.Get<GraphicsDevice> ().DisplayMode = new DisplayMode (1024, 768);
      19. SGL.Components.Get<GraphicsDevice> ().DisplayMode.Scaling = true;
      20. }
      21. public override void OnLoadContent ()
      22. {
      23. }
      24. public override void OnUnload ()
      25. {
      26. }
      27. public override void OnClose ()
      28. {
      29. }
      30. public override void OnTick (float elapsed)
      31. {
      32. }
      33. public override void OnRendering (Sharpex2D.Framework.Rendering.IRenderer renderer, float elapsed)
      34. {
      35. }
      36. #endregion
      37. }
      38. }



      Hab das zuerst in Xamarin Studio geschrieben und dachte, der Feher hat vielleicht was mit ner falschen Debugging-Konfiguration zu tun.
      Unter VS 2013 passiert allerdings das gleiche.

      Wäre nett wenn du mir da helfen könntest :)

      Gruß, Splitty
      Nutzt du eine WinForms- oder Konsolenanwendung? Die Exception wird geschmissen, wenn es sich beim Default-Handle nicht um ein Fenster handelt. Also entweder manuell eine Form zum Projekt hinzufügen und dann über ​RenderTarget.FromHandle(Form) das RenderTarget beziehen, oder WinForms-Anwendung erstellen und Default nutzen.
      Genau. Der Fehler kommt aus der GetDefault-Methode, da diese das MainWindowHandle des Prozesses verwendet. Du hast jedoch keines und somit wird die InvalidOperationException geschmissen. Siehe github.com/ThuCommix/Sharpex2D…face/RenderTarget.cs#L106


      Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

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

      Wie creac und thefiloe bereits beschrieben haben, hat die Console kein gültiges Window als MainHandle, somit muss du entweder eine Form hinzufügen, und die benutzen, oder das RenderTarget via RenderTarget.Create() selbst erstellen.

      C#-Quellcode

      1. using System;
      2. using Sharpex2D;
      3. using Sharpex2D.Framework.Rendering.GDI;
      4. using Sharpex2D.Framework.Rendering.DirectX;
      5. using Sharpex2D.Framework.Media;
      6. using Sharpex2D.Framework.Media.Sound.Wave;
      7. using Sharpex2D.Framework.Surface;
      8. namespace Test
      9. {
      10. static class Program
      11. {
      12. [STAThread]
      13. static void Main ()
      14. {
      15. SGL.Initialize (new SGLInitializer (new MainGame (), RenderTarget.Create ()));
      16. SGL.Run (new GdiRenderer (), new MediaInitializer (new WaveSoundInitializer ()));
      17. }
      18. }
      19. }
      Vielen Dank für die Antworten :)

      Nachdem das mit einer Konsolenanwendung nicht funktionierte, habe ich das ganze auch mit einer Windows Forms Anwendung versucht, einmal über RenderTarget.Default und einmal direkt per RenderTarget.FromHandle(frmSurface.Handle), hat leider beides nicht funktioniert.

      Ich werd jetzt gleich mal RenderTarget.Create versuchen, vielleicht ist mein Problem ja damit gelöst ^^

      Gruß, Splitty
      Moin,

      ich habe auch ein kleines Problem, und zwar mit der Rectangle.Contains(Rectangle)-Funktion. Code spricht für sich:

      C#-Quellcode

      1. static void Main(string[] args)
      2. {
      3. Rectangle r1 = new Rectangle(64, 96, 32, 32);
      4. Rectangle r2 = new Rectangle(72, 104, 1, 1);
      5. Vector2 v1 = new Vector2(72, 104);
      6. Console.WriteLine(r1.Contains(r2)); // ist false
      7. Console.WriteLine(r1.Contains(v1)); // ist true
      8. }
      9. }


      Wenn ich nicht irre werde, müsste auch das erste Contains() true sein, oder? ?(

      Eidt: hab den fehler selbst gefunden: github.com/ThuCommix/Sharpex2D…rk/Math/Rectangle.cs#L145

      müsste value.Y + value.Height <= Bottom; statt value.Y + Height <= Bottom; sein.

      Das hat mich ganz schön Zeit gekostet :D
      Über RenderTarget.Create() funktionert das ganze jetzt, vielen Dank :)

      Ich hatte da allerdings noch ne Frage:
      Lädt SGL die Typeface Fonts direkt aus dem Ordner des Spiels?

      Wenn ich z.B. OpenSans verwenden will, kann ich nicht davon ausgehen,
      dass die Schriftart auf dem System des Endbenutzers vorhanden ist.

      Wird die Schriftart korrekt geladen wenn ich sie einfach in den Debug Ordner kopiere und
      der Anwendung beilege?

      //Edit
      Und ist es Möglich, einen Scaling Mode anzugeben? z.B. NearestNeighbor, Bicubic, etc.?
      Ich müsste in meinem Projekt per NearestNeighbor hochskalieren, da ich einen "pixeligen" Look beibehalten möchte.

      Gruß, Splitty
      Der GdiRenderer initialisiert schlichtweg eine neue System.Drawing.Font,welche lediglich im Windows\Fonts-Ordner sucht (so scheint es zumindest nach kurzem Test)

      Also nein, die Fonts werden nicht direkt aus dem Spieleordner geladen. Wie SharpDX (Basis vom DX11Renderer) das intern macht, weiß ich nicht.

      Wenn ich das richtig sehe, kannst du dir aber eine eigene Font-Klasse erstelle, die von GdiFont, und das IContent-Interface implementieren. Dann kannst du dir deinen eigenen Fontloader per IContentExtension basteln.
      Ok dann komm ich gleich mit dem nächsten Problem :P

      Sobald ich meine Anwendung mit dem DirectX11 Renderer starte,
      stürzt sie mit folgender Fehlermeldung ab:



      Any ideas warum das passiert? :D

      // Edit

      Sorry hatte den Code vergessen ^^
      Code ist Folgender:
      Spoiler anzeigen

      C#-Quellcode

      1. using System;
      2. using Sharpex2D;
      3. using Sharpex2D.Framework.Rendering.GDI;
      4. using Sharpex2D.Framework.Rendering.DirectX;
      5. using Sharpex2D.Framework.Media;
      6. using Sharpex2D.Framework.Media.Sound.Wave;
      7. using Sharpex2D.Framework.Surface;
      8. namespace Eskalation
      9. {
      10. static class Program
      11. {
      12. [STAThread]
      13. static void Main ()
      14. {
      15. SGL.Initialize (new SGLInitializer (new MainGame (), RenderTarget.Create ()));
      16. SGL.Run (new DirectXRenderer (), new MediaInitializer (new WaveSoundInitializer ()));
      17. }
      18. }
      19. }

      Das Problem ist in Post #53 schon einmal aufgetreten, leider ohne konkreten Lösungsvorschlag. Lag wohl evtl. an einer veralteten DX-Version. Guck mal über dxdiag nach, ob DX11 unterstützt wird.
      Wegen des Fehlers vom DXRenderer:

      Pinki schrieb:

      Der DirectXRenderer benötigt mindestens Windows 7 SP1 + microsoft.com/en-us/download/details.aspx?id=36805


      @creac Den Fehler mit Rectangle werde ich gleich verbessern.

      Edit: Behoben.
      Hey, wäre ganz cool wenn du ein kleines UI-Tutorial schreiben könntest ^^
      Ich hab mich mal an ein einfaches Label rangesetzt aber es rendert einfach nicht.

      Ich habe zuerst eine Klasse namens Label erstellt und diese von UIControl abgeleitet.
      Dann habe ich die Render-Methode überschrieben (nen text gezeichnet) und das UIControl dem UIManager hinzugefügt,
      außerdem calle ich auch die Tick- und Render-Methoden des UIManagers. Wird leider trotzdem nichts gerendert.