Проекция XNA ViewPort и SpriteBatch
Я работаю над игрой XNA и использую ViewPort.Project и ViewPort.Unproject для перевода в и из мировых координат. В настоящее время я использую их для каждого объекта, который рисую с помощью SpriteBatch. То, что я хотел бы сделать, это вычислить Матрицу, которую я могу отправить SpriteBatch.Begin, чтобы выполнить преобразование пространства экрана для меня.
Вот функции, которые я сейчас использую для перевода в и из экранного пространства:
Vector2 ToWorldCoordinates(Vector2 pixels)
{
Vector3 worldPosition = graphics.GraphicsDevice.Viewport.Unproject(new Vector3(pixels, 0),
Projection, View, Matrix.Identity);
return new Vector2(worldPosition.X, worldPosition.Y);
}
Vector2 ToScreenCoordinates(Vector2 worldCoords)
{
var screenPositon = graphics.GraphicsDevice.Viewport.Project(new Vector3(worldCoords, 0),
Projection, View, Matrix.Identity);
return new Vector2(screenPositon.X, screenPositon.Y);
}
Вид установлен на Matrix.Identity, а проекция установлена следующим образом:
Projection = Matrix.CreateOrthographic(40 * graphics.GraphicsDevice.Viewport.AspectRatio, 40, 0, 1);
А вот как я сейчас рисую вещи:
spriteBatch.Begin();
foreach (var thing in thingsToDraw)
{
spriteBatch.Draw(thing.Texture, ToScreenCoordinates(thing.PositionInWorldCoordinates), thing.Color);
spriteBatch.End();
}
spriteBatch.End();
Это то, что я хотел бы сделать вместо этого (используя версию SpriteBatch.Begin () XNA 4.0)
// how do I calculate this matrix?
Matrix myTransformationMatrix = GetMyTransformationMatrix();
spriteBatch.Begin(SpriteSortMode.Immediate, null, null, null, null, null,
myTransformationMatrix);
foreach (var thing in thingsToDraw)
{
// note: no longer converting each object's position to screen coordinates
spriteBatch.Draw(thing.Texture, thing.PositionInWorldCoord,inates, thing.Color);
spriteBatch.End();
}
spriteBatch.End();