我正在尝试在我的 XNA 游戏中将每像素碰撞与精灵表集成。我主要是基于此,但它对我不起作用。
这是我从 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
. 我很高兴这种愚蠢的情况至少不是问题的一部分。