Проблемы с камерами

Я хочу, чтобы экран следовал за игроком, видя, что многие используют Matrix, чтобы заставить камеру делать то, что им нужно, я немного застреваю. У меня есть основной класс под названием Game1.cs, класс Player, в котором движение удерживается, и у большинства людей есть система движения в их функции камеры. Все, что я хочу, это чтобы камера следовала за игроком, без масштабирования или вращения (на данный момент).

У меня есть начало класса камеры:

class Camera
{
    public Matrix Transform;
    Vector2 Position;
    Viewport viewPort;

    public Camera(Viewport viewport)
    {
        viewPort = viewport;
        Position = Vector2.Zero;
    }

    public void Update(GameTime gameTime)
    {
        Transform = Matrix.CreateTranslation(Position.X, Position.Y, 0);
    }
}

Игра1.кс:

protected override void LoadContent()
{
     camera = new Camera(GraphicsDivice.Viewport);
}

Protected override void Draw(GameTime gameTime)
{
     spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend, null, null, null, null, camera.Transform);

     //Stuff Here

     spriteBatch.End();
     base.Draw(gameTime);
}

Что я упускаю? Как исправить, чтобы это работало?

Как добавить класс Player.cs?

Редактировать: 10:36, 17 марта 2014 г.

Я заставил его следовать за игроком, изменив Matrix Transform на метод и добавив Transform() в SpriteBatch.Begin(). Я также добавил public Player thing(Player player), чтобы сделать позицию равной позиции игроков. Но плеер застрял в левой части экрана.

Как сделать игрока в центре экрана?

Теперь код выглядит так:

class Camera
{
    Player player;

    public Vector2 Position;
    Viewport viewPort;

    public Matrix Transform()
    {
        var translationMatrix = Matrix.CreateTranslation(new Vector3(-Position.X, 0, 0));

        return translationMatrix;
    }

    public Player thing(Player player)
    {
        Position = player.Position;

        return player;
    }

    public Camera(Viewport viewport)
    {
        viewPort = viewport;
    }

    public void Update(GameTime gameTime)
    {
    }
}

person Ryan Foy    schedule 17.03.2014    source источник


Ответы (1)


Игрок застрял в левой части экрана, потому что вы установили положение игрока таким же, как положение камеры. Вам нужно установить смещение:

Vector2 offset = new Vector2(GraphicsDeviceManager.PreferredBackBufferWidth / 2, 0); //or whatever you like; new Vector2(100, 0) for an instance
Position = player.Position + offset; // plus or minus don't know just test
person Wallstrider    schedule 17.03.2014