我可以';t将相机固定到2D矩阵中的任何对象

本文关键字:2D 对象 任何 相机 我可以 | 更新日期: 2023-09-27 17:59:03

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

我试过什么我试着在调试模式下运行这个程序,但我总是在Camera构造函数中使用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;

我的问题:如何将相机固定在矩阵中的任何对象上,或者标准的方法是什么,因为我认为这些知识非常重要。

我可以';t将相机固定到2D矩阵中的任何对象

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

与其在TheGame构造函数中创建Camera,不如在Initialize方法中创建:

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

如何使相机固定在矩阵中的任何对象上,或者标准的方法是什么,因为我认为这些知识非常重要。

我假设您处理的是屏幕空间坐标,其中X从左到右增长,Y从上到下增长。我还假设相机位置指示相机视图的左上角,并且相机位于局部空间中的{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超出游戏世界的边界。