Sevvy325
Sevvy325

Reputation: 546

Getting a portion of a larger Texture2d with XNA

So I'm making an asteroids like game for practice in XNA. I have a Large texture I'm using for a texture atlas as described in R.B.Whitaker's wiki here: http://rbwhitaker.wikidot.com/texture-atlases-1

I've now branched off from the wiki and am attempting to make collision detection for my ship and the alien. The problem is I need the current sprite from the atlas as a separate texture2d to where I can do accurate collision detection. I've read examples using the texture2d.GetData method, but I can't seem to get a working implementation. Any detailed implementations of that method or other options would be greatly appreciated.

Upvotes: 1

Views: 5387

Answers (1)

neeKo
neeKo

Reputation: 4280

Use Texture.GetData<Color>() on your atlas texture to get the array of colors representing individual pixels:

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

When you need a rectangle of data from the texture, use a method as such:

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;
}

The method above throws index out of range exception if the rectangle is out of bounds of the original texture. width parameter is the width of the texture.

Usage with sourceRectangle of a specific sprite:

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

If you really need another texture (though I imagine you actually need color data for per pixel collision), you could do this:

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

Side note - If you need to use color data from textures constantly for collision tests, save it as an array of colors, not as textures. Getting data from textures uses the GPU while your CPU waits, which degrades performance.

Upvotes: 5

Related Questions