简体   繁体   中英

Drawing a Sprite using Monogame

I'm just starting with Monogame and I'm trying to make a simple sprite, which later is meant to be a button. I've searched all around and done several tutorials, but I can't make it work. I just keep getting the blank, blue screen. Here's my code:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Content;

namespace Test_Game
{

    class Main_Menu
    {
        //setting the variables
        public Texture2D button1;
        public Vector2 button1Pos;
        public GraphicsDevice graphicsDevice;
        GraphicsDeviceManager graphics;

        public void initialize(Texture2D texture, Vector2 position, ContentManager Content)
        {
            //Getting the initialized stuff
            button1 = Content.Load<Texture2D>("button_temp");
            button1Pos.X = 30;
            button1Pos.Y = 30;
        }

        public void Draw(SpriteBatch spriteBatch)
        {
            graphics.GraphicsDevice.Clear(Color.Black);
            spriteBatch = new SpriteBatch(graphicsDevice);
            //Just drawing the Sprite
            spriteBatch.Begin();
            spriteBatch.Draw(button1, new Rectangle(30, 30, 214, 101), Color.White);
            spriteBatch.End();
        }
    }
}

Hope you can find an answer.

I can see many mistakes in your code, I would left a comment pointing all of the, but its too long.

Most of the mistakes come from this: you're not inheriting from Game class. Your line class Main_Menu should be class Main_Menu : Game . Always use this template for a game class:

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

namespace MyGame
{
    public class MyGame : Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;

        public MyGame()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }
        protected override void Initialize()
        {
            base.Initialize();
        }
        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);
        }
        protected override void UnloadContent()
        {
        }
        protected override void Update(GameTime gameTime)
        {
            base.Update(gameTime);
        }
        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);
            base.Draw(gameTime);
        }
    }
}

From here on, you must fill this template with the following in mind:

  1. Create your memory-only objects in the Initialize method;
  2. Load and create file-related objects in the LoadContent method;
  3. Add your game logic in the Update method;
  4. Add your drawing logic in the Draw method;
  5. Usually, do not bother with the constructor or the UnloadContent method.

Connecting your existing code with the template, we get the following:

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

namespace Test_Game
{
    public class Main_Menu : Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        Vector2 buttonPos; // our button position
        Texture2D button; // our button texture

        public MyGame()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }
        protected override void Initialize()
        {
            buttonPos = new Vector2(30, 30); // X=30, Y=30
            base.Initialize();
        }
        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);
            button = Content.Load<Texture2D>("button_temp"); // load texture
        }
        protected override void UnloadContent()
        {
        }
        protected override void Update(GameTime gameTime)
        {
            // here we would add game logic
            // things like moving game objects, detecting collisions, etc
            base.Update(gameTime);
        }
        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);
            spriteBatch.Begin();
            // draw our button
            int buttonWidth = 214;
            int buttonHeight = 101;
            spriteBatch.Draw(button, new Rectangle(buttonPos.X, buttonPos.Y, buttonWidth, buttonHeight), Color.White);
            spriteBatch.End();
            base.Draw(gameTime);
        }
    }
}

This template is used in every game for the MonoGame and XNA frameworks, so you should find a LOT of content on the web about what each method of the Game class does.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM