这是我在游戏中使用的一个简单的2D相机类。
public class Camera2D
{
public Camera2D()
{
Zoom = 1;
Position = Vector2.Zero;
Rotation = 0;
Origin = Vector2.Zero;
Position = Vector2.Zero;
}
public float Zoom { get; set; }
public Vector2 Position { get; set; }
public float Rotation { get; set; }
public Vector2 Origin { get; set; }
public void Move(Vector2 direction)
{
Position += direction;
}
public Matrix GetTransform()
{
var translationMatrix = Matrix.CreateTranslation(new Vector3(Position.X, Position.Y, 0));
var rotationMatrix = Matrix.CreateRotationZ(Rotation);
var scaleMatrix = Matrix.CreateScale(new Vector3(Zoom, Zoom, 1));
var originMatrix = Matrix.CreateTranslation(new Vector3(Origin.X, Origin.Y, 0));
return translationMatrix * rotationMatrix * scaleMatrix * originMatrix;
}
}
的想法是将其应用作为变换,当你对你画你的精灵一批像这样:
var screenScale = GetScreenScale();
var viewMatrix = Camera.GetTransform();
_spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.NonPremultiplied,
null, null, null, null, viewMatrix * Matrix.CreateScale(screenScale));
你可能也注意到了使用屏幕比例的。虽然与相机没有直接关系,但它是确保您的屏幕缩放至所需分辨率的一种方法。这样,您可以绘制独立于分辨率的场景,并在最后对其进行缩放。以下是可供参考的屏幕比例尺方法:
public Vector3 GetScreenScale()
{
var scaleX = (float)_graphicsDevice.Viewport.Width/(float)_width;
var scaleY = (float)_graphicsDevice.Viewport.Height/(float)_height;
return new Vector3(scaleX, scaleY, 1.0f);
}
这真的不是很清楚你到底想要做什么吗?你想一次顺利滚动还是一次平铺?绘图时,相机位置到底应用到场景的确切程度如何? – craftworkgames