2
votes

I have read a few tutorials explaining transform matrices for XNA/Monogame. The problem is that these matrices are applied to

SpriteBatch.Begin(...matrix);

This means that all Draw code will be transformed. How do I apply a transformation matrix to a single drawable object? In my case I want to transform a scrolling background so that it automatically wraps.

SpriteBatch.Draw(.. this has no transform matrix parameter?);
2

2 Answers

2
votes

If you want to use a specific spritebatch begin call for some drawing calls only, you can start a new one as needed.

for example

SpriteBatch.Begin(...matrix);

//Draw stuff with matrix

SpriteBatch.End();

SpriteBatch.Begin();

//do the rest of the drawing

SpriteBatch.End();

this is commonly used to draw a bunch of objects with a "camera" matrix at appropraite position, scale and rotation, then another spritebatch.Begin is called to draw the flat, static UI on top, etc.

0
votes

I had this same issue, but using SpriteBatch.Begin() and SpriteBatch.End() didn't work for my situation.

You can transform a single drawable object like this (this code assumes that the object is being drawn to a destination Rectangle):

static Point Transform(Point point, Matrix matrix)
{
    var vector = point.ToVector2();
    var transformedVector = Vector2.Transform(vector, Matrix.Invert(matrix));
    return transformedVector.ToPoint();
}

// matrix below is the same as the matrix you used in SpriteBatch.Begin(...matrix).

var destinationRectangle = new Rectangle(
    Transform(bounds.Location, matrix),
    Transform(bounds.Size, matrix)
);

// Draw the object to the destination rectangle!