Класс моногид-спрайтов

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

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

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

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

Вот функция:

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

}

Всего 1 ответ


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

Интерфейс

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 .


Есть идеи?

10000