web-dev-qa-db-fra.com

Dessiner un rectangle dans XNA à l'aide de SpriteBatch

J'essaye de dessiner une forme de rectangle dans XNA en utilisant spritebatch. J'ai le code suivant:

        Texture2D rect = new Texture2D(graphics.GraphicsDevice, 80, 30);
        Vector2 coor = new Vector2(10, 20);
        spriteBatch.Draw(rect, coor, Color.Chocolate);

Mais cela ne dessine rien pour une raison quelconque. Une idée de ce qui ne va pas? Merci!

16
user700996

Votre texture ne contient aucune donnée. Vous devez définir les données de pixel:

 Texture2D rect = new Texture2D(graphics.GraphicsDevice, 80, 30);

 Color[] data = new Color[80*30];
 for(int i=0; i < data.Length; ++i) data[i] = Color.Chocolate;
 rect.SetData(data);

 Vector2 coor = new Vector2(10, 20);
 spriteBatch.Draw(rect, coor, Color.White);
20
Mark Cidade

Voici du code que vous pourriez mettre dans une classe dérivée de Game. Cela montre à la fois où et comment créer une texture blanche de 1 pixel carré (plus comment en disposer lorsque vous avez terminé). Et comment vous pouvez ensuite redimensionner et teinter cette texture au moment du dessin.

Pour dessiner des rectangles de couleur plate, cette méthode est préférable à la création de la texture elle-même à la taille souhaitée.

SpriteBatch spriteBatch;
Texture2D whiteRectangle;

protected override void LoadContent()
{
    base.LoadContent();
    spriteBatch = new SpriteBatch(GraphicsDevice);
    // Create a 1px square rectangle texture that will be scaled to the
    // desired size and tinted the desired color at draw time
    whiteRectangle = new Texture2D(GraphicsDevice, 1, 1);
    whiteRectangle.SetData(new[] { Color.White });
}

protected override void UnloadContent()
{
    base.UnloadContent();
    spriteBatch.Dispose();
    // If you are creating your texture (instead of loading it with
    // Content.Load) then you must Dispose of it
    whiteRectangle.Dispose();
}

protected override void Draw(GameTime gameTime)
{
    base.Draw(gameTime);
    GraphicsDevice.Clear(Color.White);
    spriteBatch.Begin();

    // Option One (if you have integer size and coordinates)
    spriteBatch.Draw(whiteRectangle, new Rectangle(10, 20, 80, 30),
            Color.Chocolate);

    // Option Two (if you have floating-point coordinates)
    spriteBatch.Draw(whiteRectangle, new Vector2(10f, 20f), null,
            Color.Chocolate, 0f, Vector2.Zero, new Vector2(80f, 30f),
            SpriteEffects.None, 0f);

    spriteBatch.End();
}
37
Andrew Russell

Je viens de faire quelque chose de très simple que vous pouvez appeler à partir de votre méthode Draw. Vous pouvez créer facilement un rectangle de toutes les dimensions:

private static Texture2D rect;

private void DrawRectangle(Rectangle coords, Color color)
{
    if(rect == null)
    {
        rect = new Texture2D(ScreenManager.GraphicsDevice, 1, 1);
        rect.SetData(new[] { Color.White });
    }
    spriteBatch.Draw(rect, coords, color);
}

Usage:

DrawRectangle(new Rectangle((int)playerPos.X, (int)playerPos.Y, 5, 5), Color.Fuchsia);
9
GONeale