我无法将相机固定到 2D 矩阵中的任何对象

I can't fix camera to any object in a 2D Matrix

问题描述:我正在尝试使用 XNA 框架在 C# 中开发一些带有地形碰撞的 2D 游戏。我已经完成了简单的地形生成和物体,例如汽车,可以在这个地形上移动。但是现在,我遇到了那辆车的摄像头修复问题。我试图在网上搜索很多,但找不到适合我的解决方案。当我 运行 程序时,它崩溃了。

我试过什么?我试图在调试模式下运行这个程序,但我总是卡在相机构造函数中NullReferenceException

一块Camera.cs

public class Camera {
            public Matrix transform;
            private Viewport view;
            private Vector2 centering;

        public Camera(GraphicsDevice view)
        {
            this.view = view.Viewport;
        }

        public void Update(GameTime gameTime, TheGame theGame)
        {
            centering = new Vector2(theGame.movement.position.X + theGame.movement.position.Y / 2);
            transform = Matrix.CreateScale(new Vector3(1, 1, 0)) *
                    Matrix.CreateTranslation(new Vector3(-centering.X, -centering.Y, 0));
        }
    }

相机实例调用:

    private Camera camera;
    public TheGame(Game game)
    :base(game)
    {
        this.game = game;
        camera = new Camera(GraphicsDevice); //<---- here is the crash
    }
    private Game game;

我的问题:如何让相机固定在矩阵中的任何物体上,或者说标准的方法是什么,因为我认为知识很重要。

您获得 NullReferenceException 的原因是因为 GraphicsDevice 尚未初始化

不要在 TheGame 构造函数中创建 Camera,而是在 Initialize 方法中创建它:

protected override void Initialize()
{
    base.Initialize();
    camera = new Camera(GraphicsDevice);
}

How to make camera fixed on any object in the Matrix or what is the standard way to do that, because I think that knowledge is very important.

我假设您正在处理屏幕 space 坐标,其中 X 从左到右增长,Y 从上到下增长。我还假设相机位置指示相机视图的左上角并且相机位于本地 space.

中的 {0, 0}

基于这些假设并知道您想要将相机置于中心的实体的位置,我们可以计算相机平移变换如下:

transform = Matrix.CreateTranslation(new Vector3(
    theGame.movement.position.X - view.Width / 2f, 
    theGame.movement.position.Y - view.Height / 2f, 
    0));

此转换表示:“将相机的左上角定位在游戏对象上,并减去相机视口的一半以使其居中”。

请注意,您可能还希望将相机的坐标限制在 0 和游戏世界大小之间,以确保相机不会超出使用 MathHelper.Clamp 的游戏世界范围。