我正在将我的游戏从 Pygame 迁移到 Monogame。我在根据另一个大图像的剪切创建Texture2D 时遇到困难。 我有一张包含所有资源的图片,我想为每张图片创建不同的纹理,并将它们像缓冲区一样保存在内存中。
我试过这个
Texture2D sprite = new Texture2D(game.Get_GraphicsDevice(), width, height);
Color[] data = new Color [width * height];
Texture2D sheet = texture;
sheet.GetData(0, new Microsoft.Xna.Framework.Rectangle(x, y, width, height), data, 0, data.Length);
sprite.SetData(data);
但我收到此代码错误
System.ArgumentException: 'Type T is of an invalid size for the format of this texture. (Parameter 'T')''
这不是最好的方法,因为你将有大量的纹理切换,然后导致每个精灵单独的绘制调用(FPS杀手)。我假设您将使用 SpriteBatch 绘制精灵,它实际上可以绘制纹理的一部分(也可以使用 Rectangle 结构)。
最好的做法是创建一个简单的自定义精灵类,其中您有大纹理(您的图集)中的位置和宽度/高度的字段或属性,或者更好的是,一个矩形结构,然后使用例如SpriteBatch的这个功能:
public void Draw(Texture2D texture, Vector2 position, Rectangle? sourceRectangle, Color color) {...}
通常,您会将这些“精灵”保留在字典或数组中,以便稍后使用游戏对象或实体访问它们。
这样,只要它们共享相同的纹理,所有精灵都将由 SpriteBatch 的内部批处理系统在一次绘制调用中绘制。因此,您的出发点是使用更大的图集,实际上要好得多。当然,几张大的纹理图集也是没问题的