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