45 Stimmen

Wie kann ich mit XNA Linien zeichnen?

Ich habe einen Haufen Tutorials zu XNA (und seinen verschiedenen Versionen) gelesen und bin immer noch ein wenig verwirrt, was das Zeichnen von Primitiven angeht. Alles scheint wirklich verworren zu sein.

Kann mir jemand anhand von Code die einfachste XNA-Implementierung des Zeichnens einer oder zweier Linien auf dem Bildschirm zeigen? Vielleicht mit einer kurzen Erklärung (einschließlich der Boilerplate)?

Ich bin kein Spieleprogrammierer und habe wenig Erfahrung mit XNA. Mein ultimatives Ziel ist es, einige Linien auf den Bildschirm zu zeichnen, die ich schließlich mit Drehungen usw. (von Hand) transformieren werde. Jedoch für diesen ersten Schritt.. Ich muss einfach die Linien zeichnen! Ich erinnere mich zurück in meinem alten OpenGL Tage war es ziemlich einfach, wenn eine Linie mit ein paar Methodenaufrufe zeichnen. Sollte ich einfach auf die Verwendung von unverwalteten Directx-Aufrufe zurückgreifen?

18voto

FlySwat Punkte 165766

Bei der Arbeit mit XNA muss alles (sogar 2D-Primitive) in einer Weise ausgedrückt werden, die eine 3D-Karte verstehen kann, was bedeutet, dass eine Linie nur ein Satz von Eckpunkten ist.

MSDN hat hier eine ziemlich gute Anleitung:

http://msdn.microsoft.com/en-us/library/bb196414.aspx#ID2EEF

Sie werden feststellen, dass es mehr Code benötigt, um eine primitive Linie zu rendern, als wenn Sie einfach ein texturiertes Quad einrichten und dieses drehen würden, da Sie im Grunde genommen dasselbe tun, wenn Sie eine Linie rendern.

17voto

Elideb Punkte 10562

Im Anschluss an die Antwort von NoHayProblema (ich kann noch keinen Kommentar abgeben).

Diese Antwort ist zwar die richtige Antwort auf diese alte Frage, aber unvollständig. Der Texture2D-Konstruktor gibt eine nicht initialisierte Textur zurück, die nie auf den Bildschirm gemalt wird. Um diesen Ansatz zu verwenden, müssen Sie die Daten der Textur wie folgt festlegen:

Texture2D SimpleTexture = new Texture2D(GraphicsDevice, 1, 1, false,
    SurfaceFormat.Color);

Int32[] pixel = {0xFFFFFF}; // White. 0xFF is Red, 0xFF0000 is Blue
SimpleTexture.SetData<Int32> (pixel, 0, SimpleTexture.Width * SimpleTexture.Height);

// Paint a 100x1 line starting at 20, 50
this.spriteBatch.Draw(SimpleTexture, new Rectangle(20, 50, 100, 1), Color.Blue);

Berücksichtigen Sie, dass die Art und Weise, wie Sie die Daten in Pixel schreiben, mit dem SurfaceFormat der Textur übereinstimmen muss. Das Beispiel funktioniert, weil die Textur als RGB formatiert ist. Rotationen können in spriteBatch.Draw wie folgt angewendet werden:

this.spriteBatch.Draw (SimpleTexture, new Rectangle(0, 0, 100, 1), null,
    Color.Blue, -(float)Math.PI/4, new Vector2 (0f, 0f), SpriteEffects.None, 1f);

10voto

ColacX Punkte 3762

Habe eine Anleitung dafür gefunden http://www.bit-101.com/blog/?p=2832

es verwendet einen BasicEffect (Shader) und das eingebaute Draw User Primitive in XNA 4.0

einige Codebeispiele, die ich hilfreich finde:

Methode zum Laden von Inhalten

basicEffect = new BasicEffect(GraphicsDevice);
basicEffect.VertexColorEnabled = true;
basicEffect.Projection = Matrix.CreateOrthographicOffCenter
(0, GraphicsDevice.Viewport.Width,     // left, right
GraphicsDevice.Viewport.Height, 0,    // bottom, top
0, 1);   

Zeichenmethode

basicEffect.CurrentTechnique.Passes[0].Apply();
var vertices = new VertexPositionColor[4];
vertices[0].Position = new Vector3(100, 100, 0);
vertices[0].Color = Color.Black;
vertices[1].Position = new Vector3(200, 100, 0);
vertices[1].Color = Color.Red;
vertices[2].Position = new Vector3(200, 200, 0);
vertices[2].Color = Color.Black;
vertices[3].Position = new Vector3(100, 200, 0);
vertices[3].Color = Color.Red;

GraphicsDevice.DrawUserPrimitives<VertexPositionColor>(PrimitiveType.LineList, vertices, 0, 2);

viel spaß und stimmen sie ab, wenn ihnen das geholfen hat. besuchen sie auch das tutorial, aus dem ich das hier habe.

8voto

No hay Problema Punkte 811

Nun, man kann dies auf sehr einfache Weise tun, ohne sich mit dem schrecklichen 3D-Vektor-Kram zu beschäftigen.

Erstellen Sie zum Beispiel einfach eine schnelle Textur:

Texture2D SimpleTexture = new Texture2D(GraphicsDevice, 1, 1, false, SurfaceFormat.Color);

Und dann zeichnen Sie einfach eine Linie mit dieser Textur:

this.spriteBatch.Draw(SimpleTexture, new Rectangle(100, 100, 100, 1), Color.Blue);

Ich hoffe, das hilft

4voto

Viviano Cantu Punkte 109

Am einfachsten ist es meiner Meinung nach, das Bild eines weißen Pixels zu erhalten und dieses Pixel dann in einem Rechteck zu strecken, damit es wie eine Linie aussieht

Ich habe eine Line-Klasse erstellt,

class Line
{
    Texture pixel = ((set this to a texture of a white pixel with no border));
    Vector2 p1, p2; //this will be the position in the center of the line
    int length, thickness; //length and thickness of the line, or width and height of rectangle
    Rectangle rect; //where the line will be drawn
    float rotation; // rotation of the line, with axis at the center of the line
    Color color;

    //p1 and p2 are the two end points of the line
    public Line(Vector2 p1, Vector2 p2, int thickness, Color color)
    {
        this.p1 = p1;
        this.p2 = p2;
        this.thickness = thickness;
        this.color = color;
    }

    public void Update(GameTime gameTime)
    {
        length = (int)Vector2.Distance(p1, p2); //gets distance between the points
        rotation = getRotation(p1.X, p1.Y, p2.X, p2.Y); //gets angle between points(method on bottom)
        rect = new Rectangle((int)p1.X, (int)p1.Y, length, thickness)

        //To change the line just change the positions of p1 and p2
    }

    public void Draw(SpriteBatch spriteBatch, GameTime gameTime)
    {
        spriteBatch.Draw(pixel, rect, null, color, rotation, new Vector2.Zero, SpriteEffects.None, 0.0f);
    }

    //this returns the angle between two points in radians 
    private float getRotation(float x, float y, float x2, float y2)
    {
        float adj = x - x2;
        float opp = y - y2;
        float tan = opp / adj;
        float res = MathHelper.ToDegrees((float)Math.Atan2(opp, adj));
        res = (res - 180) % 360;
        if (res < 0) { res += 360; }
        res = MathHelper.ToRadians(res);
        return res;
    }

Ich hoffe, das hilft

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X