Draw Rectangle with XNA

后端 未结 3 2005
误落风尘
误落风尘 2020-12-14 01:14

I am working on game. I want to highlight a spot on the screen when something happens.

I created a class to do this for me, and found a bit of code to draw the rect

相关标签:
3条回答
  • 2020-12-14 01:51

    This is probably not the best solution, but you should be able to use a 1x1 pixel texture stretched to fit the rectangle.

    0 讨论(0)
  • 2020-12-14 01:53

    The SafeArea demo on the XNA Creators Club site has code to do specifically that.

    You don't have to create the Texture every frame, just in LoadContent. A very stripped down version of the code from that demo:

    public class RectangleOverlay : DrawableGameComponent
    {
        SpriteBatch spriteBatch;
        Texture2D dummyTexture;
        Rectangle dummyRectangle;
        Color Colori;
    
        public RectangleOverlay(Rectangle rect, Color colori, Game game)
            : base(game)
        {
            // Choose a high number, so we will draw on top of other components.
            DrawOrder = 1000;
            dummyRectangle = rect;
            Colori = colori;
        }
    
        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);
            dummyTexture = new Texture2D(GraphicsDevice, 1, 1);
            dummyTexture.SetData(new Color[] { Color.White });
        }
    
        public override void Draw(GameTime gameTime)
        {
            spriteBatch.Begin();
            spriteBatch.Draw(dummyTexture, dummyRectangle, Colori);
            spriteBatch.End();
        }
    }
    
    0 讨论(0)
  • 2020-12-14 02:09

    This is how I did it. It is probably not the fastest or the best solution, but it works.

    using System;
    using Microsoft.Xna.Framework;
    using Microsoft.Xna.Framework.Graphics;
    
    namespace Engine
    {
        /// <summary>
        /// An extended version of the SpriteBatch class that supports line and
        /// rectangle drawing.
        /// </summary>
        public class ExtendedSpriteBatch : SpriteBatch
        {
            /// <summary>
            /// The texture used when drawing rectangles, lines and other 
            /// primitives. This is a 1x1 white texture created at runtime.
            /// </summary>
            public Texture2D WhiteTexture { get; protected set; }
    
            public ExtendedSpriteBatch(GraphicsDevice graphicsDevice)
                : base(graphicsDevice)
            {
                this.WhiteTexture = new Texture2D(this.GraphicsDevice, 1, 1);
                this.WhiteTexture.SetData(new Color[] { Color.White });
            }
    
            /// <summary>
            /// Draw a line between the two supplied points.
            /// </summary>
            /// <param name="start">Starting point.</param>
            /// <param name="end">End point.</param>
            /// <param name="color">The draw color.</param>
            public void DrawLine(Vector2 start, Vector2 end, Color color)
            {
                float length = (end - start).Length();
                float rotation = (float)Math.Atan2(end.Y - start.Y, end.X - start.X);
                this.Draw(this.WhiteTexture, start, null, color, rotation, Vector2.Zero, new Vector2(length, 1), SpriteEffects.None, 0);
            }
    
            /// <summary>
            /// Draw a rectangle.
            /// </summary>
            /// <param name="rectangle">The rectangle to draw.</param>
            /// <param name="color">The draw color.</param>
            public void DrawRectangle(Rectangle rectangle, Color color)
            {
                this.Draw(this.WhiteTexture, new Rectangle(rectangle.Left, rectangle.Top, rectangle.Width, 1), color);
                this.Draw(this.WhiteTexture, new Rectangle(rectangle.Left, rectangle.Bottom, rectangle.Width, 1), color);
                this.Draw(this.WhiteTexture, new Rectangle(rectangle.Left, rectangle.Top, 1, rectangle.Height), color);
                this.Draw(this.WhiteTexture, new Rectangle(rectangle.Right, rectangle.Top, 1, rectangle.Height + 1), color);
            }
    
            /// <summary>
            /// Fill a rectangle.
            /// </summary>
            /// <param name="rectangle">The rectangle to fill.</param>
            /// <param name="color">The fill color.</param>
            public void FillRectangle(Rectangle rectangle, Color color)
            {
                this.Draw(this.WhiteTexture, rectangle, color);
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题