【问题标题】:Getting a portion of a larger Texture2d with XNA使用 XNA 获取较大 Texture2d 的一部分
【发布时间】:2012-12-13 10:24:12
【问题描述】:

所以我正在制作一个类似小行星的游戏,用于在 XNA 中进行练习。我有一个大纹理用于纹理图集,如 R.B.Whitaker 的 wiki 中所述:http://rbwhitaker.wikidot.com/texture-atlases-1

我现在已经从 wiki 分支出来,并试图为我的船和外星人进行碰撞检测。问题是我需要将地图集中的当前精灵作为单独的 texture2d 来进行准确的碰撞检测。我已经阅读了使用 texture2d.GetData 方法的示例,但我似乎无法获得有效的实现。非常感谢该方法或其他选项的任何详细实现。

【问题讨论】:

标签: c# xna texture2d


【解决方案1】:

在您的 atlas 纹理上使用 Texture.GetData<Color>() 以获取代表单个像素的颜色数组:

Color[] imageData = new Color[image.Width * image.Height];
image.GetData<Color>(imageData);

当你需要一个矩形的纹理数据时,使用这样的方法:

Color[] GetImageData(Color[] colorData, int width, Rectangle rectangle)
{
    Color[] color = new Color[rectangle.Width * rectangle.Height];
    for (int x = 0; x < rectangle.Width; x++)
        for (int y = 0; y < rectangle.Height; y++)
            color[x + y * rectangle.Width] = colorData[x + rectangle.X + (y + rectangle.Y) * width];
    return color;
}

如果rectangle 超出原始纹理的范围,上述方法将引发索引超出范围异常。 width参数是纹理的宽度。

与特定精灵的sourceRectangle 一起使用:

Color[] imagePiece = GetImageData(imageData, image.Width, sourceRectangle);

如果你真的需要另一个纹理(虽然我想你实际上需要每个像素碰撞的颜色数据),你可以这样做:

Texture2D subtexture = new Texture2D(GraphicsDevice, sourceRectangle.Width, sourceRectangle.Height);
subtexture.SetData<Color>(imagePiece);

旁注 - 如果您需要不断使用纹理中的颜色数据进行碰撞测试,请将其保存为颜色数组,而不是纹理。在 CPU 等待时从纹理获取数据会使用 GPU,这会降低性能。

【讨论】:

  • 太棒了!这将有很大帮助!实施后我会回来的!
猜你喜欢
  • 2011-04-22
  • 1970-01-01
  • 2012-12-21
  • 1970-01-01
  • 2017-11-29
  • 2013-04-18
  • 2017-02-14
  • 2013-07-10
  • 1970-01-01
相关资源
最近更新 更多