Monogame Sprite Class












0














Im working on a level editor in monogame for my engine.



I want to make a class where i can call a simple function and it will draw a sprite.



This is the function i want to call - and as you may know you have to be able to load and unload content and use the draw method.



Question: How would I make this be able to use those so that all I have to do is call this function and it works?



Here is the function:



public static void DrawSprite(Texture2D Texture, string Path, Vector2 Position, Color Color)
{

}









share|improve this question
























  • What do you wanna do with your path parameter?
    – John Ephraim Tugado
    Nov 12 '18 at 5:44










  • That is the path of the sprite in the project folder
    – Bloody Mustache89
    Nov 12 '18 at 6:03










  • So when i do Texture.loadcontent thats the path
    – Bloody Mustache89
    Nov 12 '18 at 6:03


















0














Im working on a level editor in monogame for my engine.



I want to make a class where i can call a simple function and it will draw a sprite.



This is the function i want to call - and as you may know you have to be able to load and unload content and use the draw method.



Question: How would I make this be able to use those so that all I have to do is call this function and it works?



Here is the function:



public static void DrawSprite(Texture2D Texture, string Path, Vector2 Position, Color Color)
{

}









share|improve this question
























  • What do you wanna do with your path parameter?
    – John Ephraim Tugado
    Nov 12 '18 at 5:44










  • That is the path of the sprite in the project folder
    – Bloody Mustache89
    Nov 12 '18 at 6:03










  • So when i do Texture.loadcontent thats the path
    – Bloody Mustache89
    Nov 12 '18 at 6:03
















0












0








0







Im working on a level editor in monogame for my engine.



I want to make a class where i can call a simple function and it will draw a sprite.



This is the function i want to call - and as you may know you have to be able to load and unload content and use the draw method.



Question: How would I make this be able to use those so that all I have to do is call this function and it works?



Here is the function:



public static void DrawSprite(Texture2D Texture, string Path, Vector2 Position, Color Color)
{

}









share|improve this question















Im working on a level editor in monogame for my engine.



I want to make a class where i can call a simple function and it will draw a sprite.



This is the function i want to call - and as you may know you have to be able to load and unload content and use the draw method.



Question: How would I make this be able to use those so that all I have to do is call this function and it works?



Here is the function:



public static void DrawSprite(Texture2D Texture, string Path, Vector2 Position, Color Color)
{

}






c# class monogame






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 12 '18 at 6:23









JohnB

1,7641117




1,7641117










asked Nov 12 '18 at 5:11









Bloody Mustache89

41




41












  • What do you wanna do with your path parameter?
    – John Ephraim Tugado
    Nov 12 '18 at 5:44










  • That is the path of the sprite in the project folder
    – Bloody Mustache89
    Nov 12 '18 at 6:03










  • So when i do Texture.loadcontent thats the path
    – Bloody Mustache89
    Nov 12 '18 at 6:03




















  • What do you wanna do with your path parameter?
    – John Ephraim Tugado
    Nov 12 '18 at 5:44










  • That is the path of the sprite in the project folder
    – Bloody Mustache89
    Nov 12 '18 at 6:03










  • So when i do Texture.loadcontent thats the path
    – Bloody Mustache89
    Nov 12 '18 at 6:03


















What do you wanna do with your path parameter?
– John Ephraim Tugado
Nov 12 '18 at 5:44




What do you wanna do with your path parameter?
– John Ephraim Tugado
Nov 12 '18 at 5:44












That is the path of the sprite in the project folder
– Bloody Mustache89
Nov 12 '18 at 6:03




That is the path of the sprite in the project folder
– Bloody Mustache89
Nov 12 '18 at 6:03












So when i do Texture.loadcontent thats the path
– Bloody Mustache89
Nov 12 '18 at 6:03






So when i do Texture.loadcontent thats the path
– Bloody Mustache89
Nov 12 '18 at 6:03














1 Answer
1






active

oldest

votes


















1














If you are going to leave the drawing to a single static method then you would be restricting what you are able to draw. I suggest creating an interface and do some abstraction.



Interface



public interface IGameObject
{
void Update(GameTime gameTime);
void Draw();
}


Utility Class



public sealed class GameUtility
{
private static GameUtility instance = null;
private static readonly object _lock = new object();

public ContentManager ContentManager { get; private set; }

public SpriteBatch SpriteBatch { get; private set; }

public static GameUtility Instance
{
get
{
lock (_lock)
{
if (instance == null)
{
instance = new GameUtility();
}

return instance;
}
}
}

public void SetContentManager(ContentManager contentManager)
{
this.ContentManager = contentManager;
}

public void SetSpriteBatch(SpriteBatch spriteBatch)
{
this.SpriteBatch = spriteBatch;
}

public GameUtility(ContentManager contentManager, SpriteBatch spriteBatch)
{
this.contentManager = contentManager;
this.spriteBatch = spriteBatch;
}
}


Game Objects



public class Hero : IGameObject
{
private Texture2D texture;
private Vector2 position;
private Color color;

public Hero(string path)
{
texture = GameUtility.Instance.ContentManager.Load<Texture2D>(path);
}

public void Update(GameTime gameTime)
{
// Do game update logic
}

public void Draw()
{
GameUtility.Instance.SpriteBatch.Begin();

GameUtility.Instance.SpriteBatch.Draw(texture, position, color);

GameUtility.Instance.SpriteBatch.End();
}
}


Game Class



Initialize the GameUtility



GameUtility.Instance.SetContentManager(contentManager);
GameUtility.Instance.SetSpriteBatch(spriteBatch);


Create the game objects



gameObects = new List<IGameObject>();

gameObjects.Add(new Hero("some path"));


Utilize the interface



protected override void Draw(GameTime gameTime)
{
graphics.GraphicsDevice.Clear(Color.CornflowerBlue);

foreach (IGameObject gameObject in gameObjects)
{
gameObject.Draw();
}

base.Draw(gameTime);
}


The beauty of this approach is you can perform different drawings based on your needs. For example, you could use a Rectangle instead of Vector2 based on different scenarios. You can also draw a sprite font or something else.



For unloading content, there is only one option which is



GameUtility.Instance.ContentManager.Unload();


You better unload content during your transition to the next level as calling ContentManager.Unload() will dispose all resources. As to why it disposes everything in one go, I don't really understand but that is the design.



Hope this answer give you some insight. I would not suggest creating this public static void DrawSprite.






share|improve this answer





















    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53256250%2fmonogame-sprite-class%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    1














    If you are going to leave the drawing to a single static method then you would be restricting what you are able to draw. I suggest creating an interface and do some abstraction.



    Interface



    public interface IGameObject
    {
    void Update(GameTime gameTime);
    void Draw();
    }


    Utility Class



    public sealed class GameUtility
    {
    private static GameUtility instance = null;
    private static readonly object _lock = new object();

    public ContentManager ContentManager { get; private set; }

    public SpriteBatch SpriteBatch { get; private set; }

    public static GameUtility Instance
    {
    get
    {
    lock (_lock)
    {
    if (instance == null)
    {
    instance = new GameUtility();
    }

    return instance;
    }
    }
    }

    public void SetContentManager(ContentManager contentManager)
    {
    this.ContentManager = contentManager;
    }

    public void SetSpriteBatch(SpriteBatch spriteBatch)
    {
    this.SpriteBatch = spriteBatch;
    }

    public GameUtility(ContentManager contentManager, SpriteBatch spriteBatch)
    {
    this.contentManager = contentManager;
    this.spriteBatch = spriteBatch;
    }
    }


    Game Objects



    public class Hero : IGameObject
    {
    private Texture2D texture;
    private Vector2 position;
    private Color color;

    public Hero(string path)
    {
    texture = GameUtility.Instance.ContentManager.Load<Texture2D>(path);
    }

    public void Update(GameTime gameTime)
    {
    // Do game update logic
    }

    public void Draw()
    {
    GameUtility.Instance.SpriteBatch.Begin();

    GameUtility.Instance.SpriteBatch.Draw(texture, position, color);

    GameUtility.Instance.SpriteBatch.End();
    }
    }


    Game Class



    Initialize the GameUtility



    GameUtility.Instance.SetContentManager(contentManager);
    GameUtility.Instance.SetSpriteBatch(spriteBatch);


    Create the game objects



    gameObects = new List<IGameObject>();

    gameObjects.Add(new Hero("some path"));


    Utilize the interface



    protected override void Draw(GameTime gameTime)
    {
    graphics.GraphicsDevice.Clear(Color.CornflowerBlue);

    foreach (IGameObject gameObject in gameObjects)
    {
    gameObject.Draw();
    }

    base.Draw(gameTime);
    }


    The beauty of this approach is you can perform different drawings based on your needs. For example, you could use a Rectangle instead of Vector2 based on different scenarios. You can also draw a sprite font or something else.



    For unloading content, there is only one option which is



    GameUtility.Instance.ContentManager.Unload();


    You better unload content during your transition to the next level as calling ContentManager.Unload() will dispose all resources. As to why it disposes everything in one go, I don't really understand but that is the design.



    Hope this answer give you some insight. I would not suggest creating this public static void DrawSprite.






    share|improve this answer


























      1














      If you are going to leave the drawing to a single static method then you would be restricting what you are able to draw. I suggest creating an interface and do some abstraction.



      Interface



      public interface IGameObject
      {
      void Update(GameTime gameTime);
      void Draw();
      }


      Utility Class



      public sealed class GameUtility
      {
      private static GameUtility instance = null;
      private static readonly object _lock = new object();

      public ContentManager ContentManager { get; private set; }

      public SpriteBatch SpriteBatch { get; private set; }

      public static GameUtility Instance
      {
      get
      {
      lock (_lock)
      {
      if (instance == null)
      {
      instance = new GameUtility();
      }

      return instance;
      }
      }
      }

      public void SetContentManager(ContentManager contentManager)
      {
      this.ContentManager = contentManager;
      }

      public void SetSpriteBatch(SpriteBatch spriteBatch)
      {
      this.SpriteBatch = spriteBatch;
      }

      public GameUtility(ContentManager contentManager, SpriteBatch spriteBatch)
      {
      this.contentManager = contentManager;
      this.spriteBatch = spriteBatch;
      }
      }


      Game Objects



      public class Hero : IGameObject
      {
      private Texture2D texture;
      private Vector2 position;
      private Color color;

      public Hero(string path)
      {
      texture = GameUtility.Instance.ContentManager.Load<Texture2D>(path);
      }

      public void Update(GameTime gameTime)
      {
      // Do game update logic
      }

      public void Draw()
      {
      GameUtility.Instance.SpriteBatch.Begin();

      GameUtility.Instance.SpriteBatch.Draw(texture, position, color);

      GameUtility.Instance.SpriteBatch.End();
      }
      }


      Game Class



      Initialize the GameUtility



      GameUtility.Instance.SetContentManager(contentManager);
      GameUtility.Instance.SetSpriteBatch(spriteBatch);


      Create the game objects



      gameObects = new List<IGameObject>();

      gameObjects.Add(new Hero("some path"));


      Utilize the interface



      protected override void Draw(GameTime gameTime)
      {
      graphics.GraphicsDevice.Clear(Color.CornflowerBlue);

      foreach (IGameObject gameObject in gameObjects)
      {
      gameObject.Draw();
      }

      base.Draw(gameTime);
      }


      The beauty of this approach is you can perform different drawings based on your needs. For example, you could use a Rectangle instead of Vector2 based on different scenarios. You can also draw a sprite font or something else.



      For unloading content, there is only one option which is



      GameUtility.Instance.ContentManager.Unload();


      You better unload content during your transition to the next level as calling ContentManager.Unload() will dispose all resources. As to why it disposes everything in one go, I don't really understand but that is the design.



      Hope this answer give you some insight. I would not suggest creating this public static void DrawSprite.






      share|improve this answer
























        1












        1








        1






        If you are going to leave the drawing to a single static method then you would be restricting what you are able to draw. I suggest creating an interface and do some abstraction.



        Interface



        public interface IGameObject
        {
        void Update(GameTime gameTime);
        void Draw();
        }


        Utility Class



        public sealed class GameUtility
        {
        private static GameUtility instance = null;
        private static readonly object _lock = new object();

        public ContentManager ContentManager { get; private set; }

        public SpriteBatch SpriteBatch { get; private set; }

        public static GameUtility Instance
        {
        get
        {
        lock (_lock)
        {
        if (instance == null)
        {
        instance = new GameUtility();
        }

        return instance;
        }
        }
        }

        public void SetContentManager(ContentManager contentManager)
        {
        this.ContentManager = contentManager;
        }

        public void SetSpriteBatch(SpriteBatch spriteBatch)
        {
        this.SpriteBatch = spriteBatch;
        }

        public GameUtility(ContentManager contentManager, SpriteBatch spriteBatch)
        {
        this.contentManager = contentManager;
        this.spriteBatch = spriteBatch;
        }
        }


        Game Objects



        public class Hero : IGameObject
        {
        private Texture2D texture;
        private Vector2 position;
        private Color color;

        public Hero(string path)
        {
        texture = GameUtility.Instance.ContentManager.Load<Texture2D>(path);
        }

        public void Update(GameTime gameTime)
        {
        // Do game update logic
        }

        public void Draw()
        {
        GameUtility.Instance.SpriteBatch.Begin();

        GameUtility.Instance.SpriteBatch.Draw(texture, position, color);

        GameUtility.Instance.SpriteBatch.End();
        }
        }


        Game Class



        Initialize the GameUtility



        GameUtility.Instance.SetContentManager(contentManager);
        GameUtility.Instance.SetSpriteBatch(spriteBatch);


        Create the game objects



        gameObects = new List<IGameObject>();

        gameObjects.Add(new Hero("some path"));


        Utilize the interface



        protected override void Draw(GameTime gameTime)
        {
        graphics.GraphicsDevice.Clear(Color.CornflowerBlue);

        foreach (IGameObject gameObject in gameObjects)
        {
        gameObject.Draw();
        }

        base.Draw(gameTime);
        }


        The beauty of this approach is you can perform different drawings based on your needs. For example, you could use a Rectangle instead of Vector2 based on different scenarios. You can also draw a sprite font or something else.



        For unloading content, there is only one option which is



        GameUtility.Instance.ContentManager.Unload();


        You better unload content during your transition to the next level as calling ContentManager.Unload() will dispose all resources. As to why it disposes everything in one go, I don't really understand but that is the design.



        Hope this answer give you some insight. I would not suggest creating this public static void DrawSprite.






        share|improve this answer












        If you are going to leave the drawing to a single static method then you would be restricting what you are able to draw. I suggest creating an interface and do some abstraction.



        Interface



        public interface IGameObject
        {
        void Update(GameTime gameTime);
        void Draw();
        }


        Utility Class



        public sealed class GameUtility
        {
        private static GameUtility instance = null;
        private static readonly object _lock = new object();

        public ContentManager ContentManager { get; private set; }

        public SpriteBatch SpriteBatch { get; private set; }

        public static GameUtility Instance
        {
        get
        {
        lock (_lock)
        {
        if (instance == null)
        {
        instance = new GameUtility();
        }

        return instance;
        }
        }
        }

        public void SetContentManager(ContentManager contentManager)
        {
        this.ContentManager = contentManager;
        }

        public void SetSpriteBatch(SpriteBatch spriteBatch)
        {
        this.SpriteBatch = spriteBatch;
        }

        public GameUtility(ContentManager contentManager, SpriteBatch spriteBatch)
        {
        this.contentManager = contentManager;
        this.spriteBatch = spriteBatch;
        }
        }


        Game Objects



        public class Hero : IGameObject
        {
        private Texture2D texture;
        private Vector2 position;
        private Color color;

        public Hero(string path)
        {
        texture = GameUtility.Instance.ContentManager.Load<Texture2D>(path);
        }

        public void Update(GameTime gameTime)
        {
        // Do game update logic
        }

        public void Draw()
        {
        GameUtility.Instance.SpriteBatch.Begin();

        GameUtility.Instance.SpriteBatch.Draw(texture, position, color);

        GameUtility.Instance.SpriteBatch.End();
        }
        }


        Game Class



        Initialize the GameUtility



        GameUtility.Instance.SetContentManager(contentManager);
        GameUtility.Instance.SetSpriteBatch(spriteBatch);


        Create the game objects



        gameObects = new List<IGameObject>();

        gameObjects.Add(new Hero("some path"));


        Utilize the interface



        protected override void Draw(GameTime gameTime)
        {
        graphics.GraphicsDevice.Clear(Color.CornflowerBlue);

        foreach (IGameObject gameObject in gameObjects)
        {
        gameObject.Draw();
        }

        base.Draw(gameTime);
        }


        The beauty of this approach is you can perform different drawings based on your needs. For example, you could use a Rectangle instead of Vector2 based on different scenarios. You can also draw a sprite font or something else.



        For unloading content, there is only one option which is



        GameUtility.Instance.ContentManager.Unload();


        You better unload content during your transition to the next level as calling ContentManager.Unload() will dispose all resources. As to why it disposes everything in one go, I don't really understand but that is the design.



        Hope this answer give you some insight. I would not suggest creating this public static void DrawSprite.







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Nov 12 '18 at 6:21









        John Ephraim Tugado

        3,6511421




        3,6511421






























            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.





            Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


            Please pay close attention to the following guidance:


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53256250%2fmonogame-sprite-class%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Full-time equivalent

            Bicuculline

            さくらももこ