Monogame Sprite Class - PullRequest
       6

Monogame Sprite Class

0 голосов
/ 12 ноября 2018

Я работаю над редактором уровней в моногам для моего движка.

Я хочу создать класс, в котором я могу вызвать простую функцию, и она нарисует спрайт.

Это функция, которую я хочу вызвать - и, как вы знаете, вы должны иметь возможность загружать и выгружать контент и использовать метод draw.

Вопрос : Как мне сделать так, чтобы можно было использовать их, чтобы все, что мне нужно было сделать, это вызвать эту функцию, и она работает?

Вот функция:

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

}

1 Ответ

0 голосов
/ 12 ноября 2018

Если вы собираетесь оставить рисунок на один статический метод, то вы бы ограничивали то, что вы можете рисовать. Я предлагаю создать интерфейс и сделать некоторую абстракцию.

Интерфейс

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

Класс полезности

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;
    }
}

Игровые объекты

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();
    }
}

Игровой класс

Инициализация GameUtility

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

Создание игровых объектов

gameObects = new List<IGameObject>();

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

Использовать интерфейс

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

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

    base.Draw(gameTime);
}

Прелесть этого подхода в том, что вы можете выполнять различные рисунки в зависимости от ваших потребностей. Например, вы можете использовать Rectangle вместо Vector2 в зависимости от различных сценариев. Вы также можете нарисовать шрифт спрайта или что-то еще.

Для выгрузки контента есть только одна опция,

GameUtility.Instance.ContentManager.Unload();

Вам лучше выгружать контент при переходе на следующий уровень, так как вызов ContentManager.Unload() будет распоряжаться всеми ресурсами. Относительно того, почему он избавляется от всего за один раз, я не совсем понимаю, но это дизайн.

Надеюсь, этот ответ даст вам некоторое представление. Я бы не предложил создавать это public static void DrawSprite.

...