在XNA中移动相机,C#

时间:2013-07-03 16:02:38

标签: c# xna camera xna-4.0 monogame

我正在尝试将滚动级别设置为我正在进行的测试游戏作为学习练习。我创建了一个包含大量图块的地图,这些图块是根据它们在数组中的位置绘制的。我基本上希望相机向下滚动水平,但此刻它只是疯狂地上下摇晃一下。

我有一个相机类,它只是一个空白的静态类,包含相机位置的静态矢量2。它被设置为50,50,因为所有的瓷砖都是50乘50。

然后在我的地图更新方法中,我有以下内容:

public void Update(GameTime gameTime) {

Camera.Location.Y = MathHelper.Clamp(Camera.Location.Y + (float)speed, 0, (300 - 18) * 50)

}

300和18是瓷砖的总数和屏幕上的瓷砖数量(垂直)。

我完全失去了所以感谢任何帮助或建议。

1 个答案:

答案 0 :(得分:4)

这是我在游戏中使用的简单2D相机类。

public class Camera2D
{
    public Camera2D()
    {
        Zoom = 1;
        Position = Vector2.Zero;
        Rotation = 0;
        Origin = Vector2.Zero;
        Position = Vector2.Zero;
    }

    public float Zoom { get; set; }
    public Vector2 Position { get; set; }
    public float Rotation { get; set; }
    public Vector2 Origin { get; set; }

    public void Move(Vector2 direction)
    {
        Position += direction;
    }

    public Matrix GetTransform()
    {
        var translationMatrix = Matrix.CreateTranslation(new Vector3(Position.X, Position.Y, 0));
        var rotationMatrix = Matrix.CreateRotationZ(Rotation);
        var scaleMatrix = Matrix.CreateScale(new Vector3(Zoom, Zoom, 1));
        var originMatrix = Matrix.CreateTranslation(new Vector3(Origin.X, Origin.Y, 0));

        return translationMatrix * rotationMatrix * scaleMatrix * originMatrix;
    }
}

这个想法是将它作为一个转换应用于你如何绘制精灵批处理:

var screenScale = GetScreenScale();
var viewMatrix = Camera.GetTransform();

_spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.NonPremultiplied,
                           null, null, null, null, viewMatrix * Matrix.CreateScale(screenScale));

您可能还注意到使用了屏幕比例。虽然与相机没有直接关系,但它可以确保您的屏幕缩放到所需的分辨率。这样,您可以独立于分辨率绘制场景并在结束时缩放它。这是参考的屏幕比例方法:

    public Vector3 GetScreenScale()
    {
        var scaleX = (float)_graphicsDevice.Viewport.Width / (float)_width;
        var scaleY = (float)_graphicsDevice.Viewport.Height / (float)_height;
        return new Vector3(scaleX, scaleY, 1.0f);
    }