Sharpex2D 1.3.0 | 2D Game Framework

    • Beta
    • Open Source

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

      @'ThuCommix danke, kannst du mir an einem simplen Beispiel zeigen wie das geht?

      Also ich habe eine Textur und möchte die um n grad drehen und renderen. Wie funktioniert das?

      LG
      Whos Faster ALPHA: Bald....
      SpriteBatch.SetTransform(Matrix2x3.Rotation(x));
      spriteBatch.FillRectangle(Color.Red, rect);
      SpriteBatch.ResetTransform();

      Wobei ich mir gerade nicht ganz sicher bin ob x hiereine gradzahl oder ein bogenmaß ist. Sollte x=45 keine rotation um 45 grad ergeben, probiers mit x=45*PI /180

      Außerdem funktionieren transformationen beim ogl renderer momentan wie gesagt nicht vernünftig
      danke @enba ist im Bogenmaß.

      Noch eine Frage...Ich verwende die DirectX Renderer. Heißt das, dass die Engine jetzt durch die Grafikkarte zeichnet?

      Weil ich rendere gerade nur ein Rechteck und habe nur ca. 20 FPS
      Whos Faster ALPHA: Bald....

      Digot schrieb:

      Weil ich rendere gerade nur ein Rechteck und habe nur ca. 20 FPS


      Dann kann da was nicht stimmen.
      Wie renderst du das denn?

      Sogar mit nem Software-Renderer hättest du bei nem Rechteck weit über 20 FPS

      C#-Quellcode

      1. public override void Render(RenderDevice renderer, GameTime gameTime)
      2. {
      3. renderer.DrawString("FPS: " + avgFPS, fpsFont, new Rectangle(0,0,100,100), Color.White);
      4. renderer.SetTransform(Matrix2x3.Rotation(45f* (float)Math.PI / 180f));
      5. renderer.FillRectangle(Color.Red,sad);
      6. renderer.ResetTransform();
      7. }
      Whos Faster ALPHA: Bald....
      Ich hätte auch noch eine Frage:

      Wie ist es möglich mehrere IsKeyDown-Funktionen zu triggern?
      Sobald man zb zwei Tasten drückt wird eine von denen "losgelassen".

      Ich hoffe, ihr versteht was ich meine ;)

      C#-Quellcode

      1. public void Update(GameTime gameTime)
      2. {
      3. var state = _input.Keyboard.GetState();
      4. // Wird aktiviert...
      5. if (state.IsKeyDown(Keys.Up))
      6. {
      7. // ...
      8. }
      9. // Sobald ich "Right" drücke, wird "Up" losgelassen...
      10. if (state.IsKeyDown(Keys.Right))
      11. {
      12. // ...
      13. }
      14. }
      STEAM-PROFIL // CS:GO'LER // WEBSEITE

      Cross schrieb:

      Wie ist es möglich mehrere IsKeyDown-Funktionen zu triggern?
      Sobald man zb zwei Tasten drückt wird eine von denen "losgelassen".

      Ich hoffe, ihr versteht was ich meine ;)
      }
      [/cs]


      Ich habs jetzt nicht wirklich verstanden. :D
      Wenn du willst dass Up und Right gleichzeitig gedrückt werden sollen, mach einfach if (state.IsKeyDown (Keys.Up) && state.IsKeyDown (Keys.Right)) ...
      Und wenn du willst dass Right nur geht wenn up nicht gedrückt ist: if (!state.IsKeyDown (Keys.Up) && state.IsKeyDown (Keys.Right)) ...

      Verstehe jetzt nicht wirklich was das Problem ist :D
      Der UIManager ist wirklich nur ein Manager, Controls musst du dir selber ersrellen (von Sharpex2D.UI.UIControl erben lassen)

      Zum Thema OpenGL Transformations:

      C#-Quellcode

      1. Matrix2x3 test = Matrix2x3.Translation(320,240);
      2. spriteBatch.SetTransform(test);
      3. spriteBatch.FillRectangle(Color.Blue, new Rectangle(0, 0, 100, 150));
      4. spriteBatch.ResetTransform();
      5. spriteBatch.FillRectangle(Color.Red, new Rectangle(320, 240, 10, 10));

      Outcome:

      Und zwar, weil ich SetTransform im OpenGLGraphics-Object wie folgt verändert habe:
      Spoiler anzeigen

      C#-Quellcode

      1. public void SetTransform(Matrix2x3 matrix)
      2. {
      3. var matrixf = new float[16];
      4. matrixf[0] = matrix[0, 0];
      5. matrixf[1] = matrix[1, 0];
      6. matrixf[2] = 0;
      7. matrixf[3] = 0;
      8. matrixf[4] = matrix[0, 1];
      9. matrixf[5] = matrix[1, 1];
      10. matrixf[6] = 0;
      11. matrixf[7] = 0;
      12. matrixf[8] = 0;
      13. matrixf[9] = 0;
      14. matrixf[10] = 1f;
      15. matrixf[11] = 0;
      16. matrixf[12] = matrix.OffsetX / _graphicsDevice.BackBuffer.Width * 2;
      17. matrixf[13] = -matrix.OffsetY / _graphicsDevice.BackBuffer.Height * 2;
      18. matrixf[14] = 0;
      19. matrixf[15] = 1f;
      20. OpenGL.glMatrixMode(OpenGL.GL_PROJECTION);
      21. OpenGL.glLoadMatrixf(matrixf);
      22. OpenGL.glMatrixMode(OpenGL.GL_MODELVIEW);
      23. }
      24. /// <summary>
      25. /// Resets the Transform.
      26. /// </summary>
      27. public void ResetTransform()
      28. {
      29. OpenGL.glMatrixMode(OpenGL.GL_PROJECTION);
      30. OpenGL.glLoadIdentity();
      31. OpenGL.glMatrixMode(OpenGL.GL_MODELVIEW);
      32. }

      Eigentlich ist die Projection Matrix dafür afaik nicht gedacht, aber mit der ModelView wollte es ums verrecken nicht hinhauen. Y ist negativ, während X positiv sein muss, der Ursprung scheint bei OGL also unten rechts zu liegen, was nach meinem Verständis nach weder ein Rechts- noch ein Linkssystem ist. Dass OGL einen Wert zwischen 0 und 1 für den Offset erwartet, würde in meinen Augen auch noch Sinn machen, warum er hier aber zwischen 0 und 2 liefen muss.. ich bin verwirrt :S

      Schätze mal, dass bei der Initialisierung irgendeine Matrix falsch verschoben wurde oder so... wo sind die OGL Experten hier?
      OpenGl verwendet keines von beiden Systemen. Das wird alles durch die Matrizen festgelegt.
      Was mir gleich auch auffällt, dass hier die alten OGL Methoden verwendet werden. Eigt. Soll nun alles über Shader laufen...
      Ich wollte auch mal ne total überflüssige Signatur:
      ---Leer---
      Von den alten Funktionen mal abgesehen: Nehmen wir an, ich möchte in OGL ein Koordinatensystem schaffen, dessen Ursprung oben links liegt und bei dem 1f der rechten bzw. unteren Kante des RenderTargets entspricht. Wie gehe ich sowas dann an, welche Matrizen muss ich setzen?
      Ich kenn mich mit Sharpex leider nicht aus. Aber beim erstellen der ProjektionsMatrix kann man normalerweise left, right, top und bottom angeben. Damit kann man die Bidschirmkoordinaten skalieren und natürlich auch das Koordinaten System der Bidschirmkoordinaten angeben. Willst du es wie bei WinForms haben, dann sind left und top 0. Bottom und right gerne viewport breite bzw. Höhe (Für eine Einheit pro Pixel auf Bidschirmkoordinaten). Kann natürlich über andere werte skalieren/verzerren.
      Das ganze heißt dann aber immer noch nicht, dass sich die Objekte verhalten wie du willst. Durch die viewworld kann man das wieder umkehren^^
      Ich wollte auch mal ne total überflüssige Signatur:
      ---Leer---

      C#-Quellcode

      1. OpenGL.glMatrixMode(OpenGL.GL_MODELVIEW);
      2. OpenGL.glLoadIdentity();
      3. OpenGL.glOrtho(0, _graphicsDevice.BackBuffer.Width, _graphicsDevice.BackBuffer.Height, 0,
      4. 1, -1);

      Wird bei Init und Resize aufgerufen.Reihenfolge der Params ist Left, Right, Bottom, Top, zfar, znear, das passt also. Kanns sein, dass ich vorher die Matrix auf GL_PROJECTION setzen muss?

      Edit: Jo dann passt tatsächlich alles.
      Du musst auch die Projektionsmatrix anpassen, entsprechend mit dem Viewport(Clientbereich, in dem gerendert wird).
      Sollte denk ich funktionieren, wenn du z.B. das Fenster vergrößerst, bevor die Projektionsmatrix zum ersten mal erstellt wird...
      Ich wollte auch mal ne total überflüssige Signatur:
      ---Leer---