在 C# Monogame 中选择图像区域

问题描述 投票:0回答:1

我正在将我的游戏从 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')''

c# .net monogame
1个回答
0
投票

这不是最好的方法,因为你将有大量的纹理切换,然后导致每个精灵单独的绘制调用(FPS杀手)。我假设您将使用 SpriteBatch 绘制精灵,它实际上可以绘制纹理的一部分(也可以使用 Rectangle 结构)。

最好的做法是创建一个简单的自定义精灵类,其中您有大纹理(您的图集)中的位置和宽度/高度的字段或属性,或者更好的是,一个矩形结构,然后使用例如SpriteBatch的这个功能:

public void Draw(Texture2D texture, Vector2 position, Rectangle? sourceRectangle, Color color) {...}

通常,您会将这些“精灵”保留在字典或数组中,以便稍后使用游戏对象或实体访问它们。

这样,只要它们共享相同的纹理,所有精灵都将由 SpriteBatch 的内部批处理系统在一次绘制调用中绘制。因此,您的出发点是使用更大的图集,实际上要好得多。当然,几张大的纹理图集也是没问题的

© www.soinside.com 2019 - 2024. All rights reserved.