在XNA中移动摄影机,C#

在XNA中移动摄影机,C#,c#,xna,camera,xna-4.0,monogame,C#,Xna,Camera,Xna 4.0,Monogame,我正在尝试做一个滚动级别的测试游戏,我正在做一个学习练习。我已经创建了一个包含许多瓷砖的地图,这些瓷砖是根据它们在阵列中的位置绘制的。我基本上希望相机向下滚动,但现在它只是疯狂地上下晃动了一下 我有一个camera类,它只是一个空白的静态类,包含一个用于相机位置的静态向量2。它只是设置为50,50,因为所有的瓷砖都是50乘50 然后,在“地图更新”方法中,我有以下内容: public void Update(GameTime gameTime) { Camera.Location.Y = Ma

我正在尝试做一个滚动级别的测试游戏,我正在做一个学习练习。我已经创建了一个包含许多瓷砖的地图,这些瓷砖是根据它们在阵列中的位置绘制的。我基本上希望相机向下滚动,但现在它只是疯狂地上下晃动了一下

我有一个camera类,它只是一个空白的静态类,包含一个用于相机位置的静态向量2。它只是设置为50,50,因为所有的瓷砖都是50乘50

然后,在“地图更新”方法中,我有以下内容:

public void Update(GameTime gameTime) {

Camera.Location.Y = MathHelper.Clamp(Camera.Location.Y + (float)speed, 0, (300 - 18) * 50)

}
300和18是瓷砖总数和屏幕上瓷砖的数量(垂直)


我完全迷路了,非常感谢您的帮助和建议。

这里有一个简单的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);
    }

现在还不清楚你到底想干什么?您想要平滑滚动还是一次一个平铺?在绘制时,摄影机位置如何精确应用于场景?GetScreenScale方法中的_width和_height变量是什么?