XNA 2D相机 - 如何使其正确遵循精灵

时间:2014-10-22 01:45:33

标签: c# camera xna 2d sprite

你好,很棒的人!

让我们切入追逐。 我已经制作了一个相对于我的相机绘制地图的平铺引擎(绘制的平铺是在相机窗口中可见的平铺),并且我制作了一个居中的精灵(我的角色)相机。 每当我移动相机时,我的角色都会相应地跟随,唯一的问题是当我到达地图的边界时。以我的方式编程限制了我的相机移动超出边界,导致限制我的角色移近边界(因为它总是在相机中居中)。

如何将我的相机从我邪恶地图的限制中解放出来?

P.S。我已经制作了picture来说明我想做的事情。 这是我跟随的guide

这是我的代码,我绘制瓷砖并放置相机:

protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.Black);

        spriteBatch.Begin();

        Vector2 firstSquare = new Vector2(Camera.Location.X / Tile.TileWidth, Camera.Location.Y / Tile.TileHeight);
        int firstX = (int)firstSquare.X;
        int firstY = (int)firstSquare.Y;

        Vector2 squareOffset = new Vector2(Camera.Location.X % Tile.TileWidth, Camera.Location.Y % Tile.TileHeight);
        int offsetX = (int)squareOffset.X;
        int offsetY = (int)squareOffset.Y;

        for (int y = 0; y < squaresDown; y++)
        {
            for (int x = 0; x < squaresAcross; x++)
            {
                foreach (int tileID in myMap.Rows[y + firstY].Columns[x + firstX].BaseTiles)
                {
                    spriteBatch.Draw(
                        Tile.TileSetTexture,
                        new Rectangle(
                            (x * Tile.TileWidth) - offsetX, (y * Tile.TileHeight) - offsetY,
                            Tile.TileWidth, Tile.TileHeight),
                        Tile.GetSourceRectangle(tileID),
                        Color.White);
                }
            }
        }

        spriteBatch.End();
        // TODO: Add your drawing code here

        base.Draw(gameTime);
    }

以下是移动相机的代码:

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);
    }

1 个答案:

答案 0 :(得分:1)

您需要让相机跟随播放器,而不是让您的播放器跟随相机。这样你就可以对相机设置限制,而不是试图破解相机系统来让角色做事。

在每次更新时,您都会有类似的内容:

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