我可以';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;
我的问题:如何将相机固定在矩阵中的任何对象上,或者标准的方法是什么,因为我认为这些知识非常重要。
获得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
超出游戏世界的边界。