45 votes

Comment dessiner des lignes avec XNA?

J'ai lu un tas de tutoriels impliquant XNA (et c'est différentes versions) et je suis toujours un peu confus sur le dessin primitives. Tout semble être vraiment compliquée.

Quelqu'un peut-il me montrer, à l'aide de code, le plus simple XNA mise en œuvre de dessiner une ou deux lignes sur l'écran? Peut-être avec une brève explication (y compris le code)?

Je ne suis pas un programmeur de jeux et j'ai peu de XNA expérience. Mon but ultime est de tracer quelques lignes sur l'écran, je vais finir par se transformer avec les rotations, etc (à la main). Cependant, pour cette première étape.. j'ai besoin de simplement dessiner les lignes! Je me souviens que dans mon ancienne OpenGL jours, il était assez simple lorsque vous tracez une ligne avec quelques appels de méthode. Dois-je tout simplement revenir à l'utilisation non géré directx appels?

18voto

FlySwat Points 61945

Lorsque vous travaillez avec XNA, tout (même en 2d primitives) doivent être exprimés d'une manière qu'une carte 3d peut comprendre, ce qui signifie qu'une ligne est un ensemble de sommets.

MSDN a une assez bonne soluce ici:

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

Vous constaterez qu'il faut plus de code pour rendre une ligne primitive que ce qu'il à juste l'installation d'une texture de quad et de rotation qui, depuis, en substance, ce que vous faites la même chose lors du rendu d'une ligne.

16voto

Elideb Points 2612

Suivant NoHayProblema de réponse (je n'ai pas de commentaire pour l'instant).

Cette réponse, bien que correct pour cette vieille question, est incomplète. Texture2D constructeur renvoie une texture non initialisée, ce qui n'est jamais peint sur l'écran. Pour utiliser cette approche, vous devez définir la texture de données comme ceci:

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);

Prendre en compte que la façon d'écrire les données en pixels doit être compatible avec la texture du SurfaceFormat. L'exemple fonctionne parce que la texture est formaté en RVB. Les Rotations peuvent être appliquées dans spriteBatch.Dessiner comme ceci:

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 Points 766

trouvé un tutoriel pour cela http://www.bit-101.com/blog/?p=2832

il utilise un BasicEffect (shader) et la primitive utilisateur de dessin intégrée dans XNA 4.0

Quelques exemples de code que je trouve utiles:

méthode de chargement du contenu

 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);   
 

méthode de dessin

 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);
 

Amusez-vous et votez si cela vous a aidé. aussi rendre visite au tutoriel je l'ai obtenu de.

8voto

No hay Problema Points 442

Eh bien, vous pouvez le faire de manière très simple sans entrer dans les vecteurs 3D horribles.

Créez simplement une texture rapide, par exemple:

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

Et ensuite, tracez une ligne en utilisant cette texture:

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

J'espère que ça aide

4voto

Viviano Cantu Points 31

Le meilleur moyen, à mon avis, consiste à obtenir l’image d’un pixel blanc, puis à étirer ce pixel dans un rectangle pour lui donner l’impression d’une ligne.

J'ai fait une classe de ligne,

 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;
    }
 

J'espère que cela t'aides

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X