Texture2D.GetData索引超出范围

本文关键字:范围 索引 GetData Texture2D | 更新日期: 2023-09-27 18:13:01

我试图在我的XNA游戏中整合逐像素碰撞与精灵表。我主要是以此为基础,但这对我不起作用。

以下是我从精灵表左上角的精灵获取数据的方法。它似乎工作得很好——至少没有错误。
Rectangle SpriteSource = new Rectangle(0, 0, 32, 32);
ColorData = new Color[SpriteSource.Width * SpriteSource.Height];
Owner.Spritesheet.GetData(0, SpriteSource, ColorData, SpriteSource.X * SpriteSource.Y, 
SpriteSource.Width * SpriteSource.Height);

现在要获得一个不在左上角的精灵:

Rectangle SpriteSource = new Rectangle(48, 32, 16, 32);
ColorData = new Color[SpriteSource.Width * SpriteSource.Height];
Owner.Spritesheet.GetData(0, SpriteSource, ColorData, SpriteSource.X * SpriteSource.Y,
SpriteSource.Width * SpriteSource.Height);

完全相同的代码,除了将矩形偏移(48,32)。但由于某种原因,它会抛出异常"此参数必须是数组内的有效索引"。参数名称:dataIndex"

我做错了什么?dataIndex在这个实例中指的是什么?是ColorData数组,还是实际的Texture2D?此外,如果我没有做任何特殊的"mipmapping"-不完全确定那是什么,但我有一个粗略的想法-我会使用0作为mipmapping级别,对吧?

编辑:更多信息(SS = SpriteSource, o.t x = Owner.Spritesheet):

只要SS.X <= O.Tex.Width - SS.WidthSS.Y == 0,代码编译/运行良好。如果是SS.X > O.Tex - SS.Width,它会产生一个完全预期的"矩形对于这个资源来说太大或太小"的错误。改变Y,保持X为0也是一样。

但是,如果以下所有内容都为真:SS.X > 0 && SS.Y > 0 && (SS.X * SS.Y) < (SS.Width * SS.Height),同样令人沮丧但不同的错误"此参数必须是数组内的有效索引"。产生参数名称:elementCount"。

EDIT2:似乎我对elementCount错误有点错误,它可以在SS.X * SS.Y > SS.Width * SS.Height的条件下产生。我很高兴这种愚蠢的情况至少不是问题的一部分。

Texture2D.GetData索引超出范围

我不是XNA程序员,但如果Spritesheet是Texture2D,我相信我知道为什么你有问题。让我们仔细看看这些参数:

  • int level - Mipmap level
  • Nullable -的部分要复制的纹理。null表示数据将从整个纹理
  • T[] data -数据数组
  • startIndex -获取
  • 的第一个元素的索引
  • int elementCount -获取的元素数

因为你传入SpriteSource作为第二个参数,你已经选择了纹理的一个子部分。第四个参数是作为第二个参数传入的矩形(SpriteSource)的起始索引!

在第一种情况下,一切都如预期的那样工作,因为你有效地将0作为第四个参数传递给GetData (SpriteSource)。X和spriteresource。第二种情况失败了,因为你说开始索引应该是1024,这比SpriteSource的大小(16 * 32 = 512)要大。如果你传入0作为第四个参数,它将工作,因为它将意味着"在SourceSprite中从索引0开始"。

所以,如果SourceSprite总是你想要的精灵在精灵表中的矩形,传递0作为startIndex,你就会得到你想要的精灵。

我想…