我无法将相机固定到 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
的游戏世界范围。
问题描述:我正在尝试使用 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
的游戏世界范围。