Texture2D.GetData“索引超出范围”
我正尝试在每个像素碰撞中与我的XNA游戏中的spritesheets进行整合。我主要是基于this,但它不适合我。Texture2D.GetData“索引超出范围”
以下是我在从spritesheet左上角的sprite获取数据的过程。它似乎工作正常 - 至少没有错误。
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.Tex = Owner.Spritesheet):
只要SS.X <= O.Tex.Width - SS.Width
和SS.Y == 0
,代码编译/运行正常。 如果SS.X > O.Tex - SS.Width
,它会产生一个完全预期的“矩形对于此资源来说太大或太小”的错误。 用于更改Y并将X保持为零。
但是,如果满足以下条件: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
的条件下生成。我很高兴至少这样一个愚蠢的条件不是问题的一部分。
我不是XNA程序员,但如果Spritesheet是Texture2D我相信我知道你为什么有问题。 让我们来仔细看看参数:
- INT水平 - MIPMAP级
- 可空 - 的 纹理复制的部分。 空指示数据将从 整个纹理复制
- T []数据 - 数据的阵列诠释
- 的startIndex - 第一个元素的索引以获得
- INT elementCount中 - 元素Numnber得到
由于您将SpriteSource作为第二个参数传递,因此您已经选择了纹理的子部分。第四个参数是作为第二个参数传入的矩形(SpriteSource)的起始索引!
在第一种情况下,一切都按预期工作,因为您有效地传入0作为GetData的第四个参数(SpriteSource.X和SpriteSource.Y都为0,并且0 * 0 = 0)。第二种情况失败,因为你说起始索引应该是1024,这大于SpriteSource的大小(16 * 32 = 512)。如果你传入0作为第四个参数,它将起作用,因为它意味着“从SourceSprite中的索引0开始”。
因此,如果SourceSprite始终是您想要的spritesheet中的精灵的矩形,请以startIndex的形式传入0,然后您将得到您之后的精灵。
我认为...
你完全正确。事情是,在我链接的线程中,这个人为他所有不同的精灵使用一个ColorData数组,这就是为什么它不适合我。我现在已经掌握了所有的工作。虽然我不明白为什么startIndex参数的描述是“要获取的第一个元素的索引” - 不应该设置它?无论哪种方式,非常感谢您花时间帮助我。 – 2013-05-11 07:12:20
@ 7heSama 很高兴听到我说得对。至于“get”与“set”,你从源头获取元素(第二个参数)并将其复制到目标中(第三个参数)。 – user1323245 2013-05-11 07:48:09
一个像素碰撞提示,检查第一个箱体碰撞,然后像素碰撞。但最终我会删除像素collsion,因为当你有很多对象时它确实滞后。现在我只用盒子和圆圈碰撞。 – 2013-05-11 09:23:12