所以我在XNA中制作了一个像小游戏一样的小行星。我有一个大纹理,我正在使用纹理图集,如R.B.Whitaker的wiki所述:http://rbwhitaker.wikidot.com/texture-atlases-1
我现在已经从维基分支出来,并试图对我的船和外星人进行碰撞检测。问题是我需要将来自地图集的当前精灵作为单独的texture2d,以便我可以进行准确的碰撞检测。我已经阅读了使用texture2d.GetData方法的示例,但我似乎无法获得有效的实现。非常感谢该方法或其他选项的任何详细实现。
答案 0 :(得分:4)
在地图集纹理上使用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,这会降低性能。