0

我正在尝试在我的 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.WidthSS.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. 我很高兴这种愚蠢的情况至少不是问题的一部分。

4

1 回答 1

1

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

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

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

在第一种情况下,一切都按预期工作,因为您有效地将 0 作为第四个参数传递给 GetData(SpriteSource.X 和 SpriteSource.Y 都是 0,并且 0 * 0 = 0)。第二种情况失败,因为您说起始索引应该是 1024,它大于 SpriteSource 的大小 (16 * 32 = 512)。如果您将 0 作为第四个参数传入,它将起作用,因为它意味着“从 SourceSprite 中的索引 0 开始”。

因此,如果 SourceSprite 始终是您想要的 spritesheet 中精灵的矩形,则将 0 作为 startIndex 传递,您将获得您想要的精灵。

我认为...

于 2013-05-11T07:05:57.947 回答