你的问题有点不清楚,但我想我明白了。让我们看看您的要求。
- 您有一个高架摄像机,可以直接俯视二维平面。我们可以将其表示为一个简单的 {x, y} 坐标对,对应于相机所观察的平面上的点。
- 摄像机可以跟踪某些物体的运动,可能是玩家,但更一般地说是游戏世界中的任何物体。
- 摄像机必须保持在游戏世界的有限范围内。
这很容易实现。从广义上讲,在你内心的某个地方Update()
您需要执行以下步骤来满足每个要求:
if (cameraTarget != null)
{
camera.Position = cameraTarget.Position;
ClampCameraToWorldBounds();
}
换句话说:如果我们有一个目标物体,则将我们的位置锁定到它的位置;但要确保我们不会越界。
ClampCameraToBounds()
实施起来也很简单。假设你有某个对象,world
,其中包含一个Bounds
表示世界范围(以像素为单位)的属性:
private void ClampCameraToWorldBounds()
{
var screenWidth = graphicsDevice.PresentationParameters.BackBufferWidth;
var screenHeight = graphicsDevice.PresentationParameters.BackBufferHeight;
var minimumX = (screenWidth / 2);
var minimumY = (screnHeight / 2);
var maximumX = world.Bounds.Width - (screenWidth / 2);
var maximumY = world.Bounds.Height - (screenHeight / 2);
var maximumPos = new Vector2(maximumX, maximumY);
camera.Position = Vector2.Clamp(camera.Position, minimumPos, maximumPos);
}
这可以确保相机与世界边缘的距离永远不会超过屏幕的一半。为什么是半屏?因为我们将相机的 {x, y} 定义为相机正在观察的点,这意味着它应始终位于屏幕中央。
这应该会给你一个具有你在问题中指定的行为的相机。从这里开始,只需实现地形渲染器,以便相对于相机对象指定的 {x, y} 坐标绘制背景。
给定一个对象在游戏世界坐标中的位置,我们可以将该位置转换为相机空间:
var worldPosition = new Vector2(x, y);
var cameraSpace = camera.Position - world.Postion;
然后从相机空间进入屏幕空间:
var screenSpaceX = (screenWidth / 2) - cameraSpace.X;
var screenSpaceY = (screenHeight / 2) - cameraSpace.Y;
然后,您可以使用对象的屏幕空间坐标来渲染它。