Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单游戏精灵类_C#_Class_Monogame - Fatal编程技术网

C# 单游戏精灵类

C# 单游戏精灵类,c#,class,monogame,C#,Class,Monogame,我正在为我的引擎开发monogame中的关卡编辑器 我想创建一个类,在这里我可以调用一个简单的函数,它将绘制一个精灵 这是我想要调用的函数——您可能知道,您必须能够加载和卸载内容并使用draw方法 问题:我如何使这个函数能够使用这些函数,以便我所要做的就是调用这个函数并使其工作 以下是函数: public static void DrawSprite(Texture2D Texture, string Path, Vector2 Position, Color Color) { } 如果要将

我正在为我的引擎开发monogame中的关卡编辑器

我想创建一个类,在这里我可以调用一个简单的函数,它将绘制一个精灵

这是我想要调用的函数——您可能知道,您必须能够加载和卸载内容并使用draw方法

问题:我如何使这个函数能够使用这些函数,以便我所要做的就是调用这个函数并使其工作

以下是函数:

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

}

如果要将图形留给单个静态方法,则将限制您能够绘制的内容。我建议创建一个接口并进行一些抽象

接口

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();
    }
}
游戏对象

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();
    }
}
创建游戏对象

gameObects = new List<IGameObject>();

gameObjects.Add(new Hero("some path"));
这种方法的美妙之处在于,您可以根据需要执行不同的绘图。例如,您可以根据不同的场景使用
矩形
而不是
Vector2
。您也可以绘制精灵字体或其他东西

对于卸载内容,只有一个选项是

GameUtility.Instance.ContentManager.Unload();
您最好在过渡到下一个级别时卸载内容,因为调用
ContentManager.unload()
将处理所有资源。至于为什么它一次处理所有东西,我真的不明白,但这就是设计


希望这个答案能给你一些启示。我不建议创建这个
公共静态void DrawSprite

你想用你的路径参数做什么?这是项目文件夹中精灵的路径所以当我使用Texture.loadcontent时这就是路径