Small project to show drawing items with the mouse in XNA
Wednesday, February 3rd, 2010I saw a post today on the XNA Community Forums asking how to give a player the possibility of adding things to a game, and storing the position of the added images.
I made a little project to show how to do this. Basically it adds a Vector2 to a generic List when the left mouse button is pressed and removes a Vector2 when the right mousebutton is pressed.
Here's a small demo:
using System.Collections.Generic; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; namespace SmallXNADrawingGame { /// <summary> /// Small class to show how to be able to draw and store objects in XNA. /// /// Jakob "XNAFAN" Krarup - February 2010 /// http://www.xnafan.net /// </summary> public class Game1 : Microsoft.Xna.Framework.Game { GraphicsDeviceManager graphics; SpriteBatch spriteBatch; //a list to store the dots in List<Vector2> positionOfDots = new List<Vector2>(); //the dot to use for drawing Texture2D textureDot; //stores half the size of the dot for centering the texture Vector2 halfSizeOfDot; //stores the current and previous states of the mouse //they are used to compare in Update() to make sure //a mouseclick is a new one and not just the button being held MouseState currentMouse, oldMouse; //font for writing instructions SpriteFont defaultFont; public Game1() { graphics = new GraphicsDeviceManager(this); //set size of screen graphics.PreferredBackBufferHeight = 600; graphics.PreferredBackBufferWidth = 800; Content.RootDirectory = "Content"; //make sure to display mouse cursor this.IsMouseVisible = true; } protected override void LoadContent() { // Create a new SpriteBatch, which can be used to draw textures. spriteBatch = new SpriteBatch(GraphicsDevice); textureDot = Content.Load<Texture2D>("dot"); //calculate half the size of a dot and store it //for drawing the dot centered on the mouseclick (se Draw()) halfSizeOfDot = new Vector2(textureDot.Width / 2, textureDot.Height / 2); //load the font defaultFont = Content.Load<SpriteFont>("DefaultFont"); } protected override void Update(GameTime gameTime) { //store the current state of the mouse (buttons, position, etc.) currentMouse = Mouse.GetState(); //if the mousebutton was pressed between this and last update... //this check makes certain that one click doesn't create multiple dots because the button is held down if (currentMouse.LeftButton == ButtonState.Pressed && oldMouse.LeftButton == ButtonState.Released) { positionOfDots.Add(new Vector2(currentMouse.X, currentMouse.Y)); } //if right mousebutton was pressed if (currentMouse.RightButton == ButtonState.Pressed && oldMouse.RightButton == ButtonState.Released) { //and there are still dots left if (positionOfDots.Count > 0) { //remove the last //"-1" is because the list i zero-indexed, //so a count of 1 would remove the dot at position 1-1 (zero). positionOfDots.RemoveAt(positionOfDots.Count - 1); } } base.Update(gameTime); //store the current state in oldMouse //to be able to determine when buttons have JUST been pressed //by comparing the two states in an update oldMouse = currentMouse; } protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.CornflowerBlue); spriteBatch.Begin(); //write instructions spriteBatch.DrawString(defaultFont, "Left mousebutton to draw dot", new Vector2(20, 20), Color.White); spriteBatch.DrawString(defaultFont, "Right mousebutton to delete dots", new Vector2(20, 40), Color.White); foreach (Vector2 position in positionOfDots) { //draw the dot centered on the position of the mouse //by subtracting the Vector //which has half the textures width for X and half the textures height for Y //from the position stored. spriteBatch.Draw(textureDot, position - halfSizeOfDot, Color.White); //draw the dot's position spriteBatch.DrawString(defaultFont, position.ToString(), position, Color.White); } base.Draw(gameTime); spriteBatch.End(); } } }