C# XNA 2D相机-如何使其正确跟随sprite 大家好,大家好!

C# XNA 2D相机-如何使其正确跟随sprite 大家好,大家好!,c#,camera,xna,2d,sprite,C#,Camera,Xna,2d,Sprite,让我们开门见山吧。 我制作了一个平铺引擎,用于绘制相对于相机的地图(绘制的平铺是在相机窗口中可见的平铺),并制作了一个位于相机中心的精灵(我的角色)。 每当我移动相机,我的角色就会跟着移动,唯一的问题是当我到达地图的边界时。我的编程方式限制了我的相机移动到边界之外,从而限制了我的角色移动到更接近边界的位置(因为它始终位于相机的中心) 我怎样才能使我的相机摆脱邪恶地图的束缚 p、 我已经做了一个例子来说明我想做什么。 这是我遵循的原则 以下是我的代码,我在其中绘制瓷砖并放置相机: 你需要让你的相机

让我们开门见山吧。 我制作了一个平铺引擎,用于绘制相对于相机的地图(绘制的平铺是在相机窗口中可见的平铺),并制作了一个位于相机中心的精灵(我的角色)。 每当我移动相机,我的角色就会跟着移动,唯一的问题是当我到达地图的边界时。我的编程方式限制了我的相机移动到边界之外,从而限制了我的角色移动到更接近边界的位置(因为它始终位于相机的中心)

我怎样才能使我的相机摆脱邪恶地图的束缚

p、 我已经做了一个例子来说明我想做什么。 这是我遵循的原则

以下是我的代码,我在其中绘制瓷砖并放置相机:
你需要让你的相机跟随玩家,而不是让玩家跟随相机。这样,您就可以对摄影机设置限制,而不是试图侵入摄影机系统以使角色执行操作

在每次更新中,您都会遇到以下情况:

Player.Update(gametime);
Camera.Update(Player.Position);

当摄影机到达边缘时,则改为移动角色。或者在捕捉按键的地方添加一些偏移量(例如:
myMap.MapWidth-squarescross+offset
),这样相机会移动得更远。在尝试解决方案时,我注意到我的程序存在另一个缺陷。每当我的相机移动到边界外时,程序就会试图绘制索引为负的平铺,导致游戏崩溃。我可以在这里得到帮助吗,或者我应该发布一个新的qestion吗?这是因为当你得到负的相机坐标时,你正在索引一个负值。假设贴图始终从0,0开始,因此解决此问题的最简单方法是根本不处理负坐标。像这样初始化:intfirsty=(int)MathHelper.Clamp(firstSquare.Y,0,squaresDown);int firstX=(int)MathHelper.Clamp(firstSquare.X,0,squarescross);谢谢你迄今为止的帮助,我真的很感激。但即使应用了你的代码,我的程序仍然会给我一记耳光。我发现还是有什么东西给了它一个负值,所以我尝试添加代码,结果证明没有任何帮助。错误代码的翻译是:索引超出范围。必须为非负且小于集合参数名称的大小
protected override void Update(GameTime gameTime)
    {
        // Allows the game to exit
        if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
            this.Exit();

        IsMouseVisible = true;
        KeyboardState ks = Keyboard.GetState();
        if (ks.IsKeyDown(Keys.A))
        {
            Camera.Location.X = MathHelper.Clamp(Camera.Location.X - 2, 0, (myMap.MapWidth - squaresAcross) * Tile.TileWidth);
        }

        if (ks.IsKeyDown(Keys.D))
        {
            Camera.Location.X = MathHelper.Clamp(Camera.Location.X + 2, 0, (myMap.MapWidth - squaresAcross) * Tile.TileWidth);
        }

        if (ks.IsKeyDown(Keys.W))
        {
            Camera.Location.Y = MathHelper.Clamp(Camera.Location.Y - 2, 0, (myMap.MapHeight - squaresDown) * Tile.TileHeight);
        }

        if (ks.IsKeyDown(Keys.S))
        {
            Camera.Location.Y = MathHelper.Clamp(Camera.Location.Y + 2, 0, (myMap.MapHeight - squaresDown) * Tile.TileHeight);
        }
        // TODO: Add your update logic here

        base.Update(gameTime);
    }
Player.Update(gametime);
Camera.Update(Player.Position);