Положение спрайта перемещается быстрее, чем область просмотра - PullRequest
1 голос
/ 14 февраля 2011

Вчера я кое-что делал с окном просмотра в XNA и не мог понять, почему спрайт, который я использую, перемещается быстрее моего окна просмотра при изменении позиций.У меня было ощущение, что это может быть связано с различными типами значений (int и float), но не захочет ли кто-нибудь уточнить это?

    Viewport myViewport;
    Texture2D t;
    SpriteFont f;
    Vector2 point = new Vector2(0, 0);  

    /// <summary>
    /// Allows the game to run logic such as updating the world,
    /// checking for collisions, gathering input, and playing audio.
    /// </summary>
    /// <param name="gameTime">Provides a snapshot of timing values.</param>
    protected override void Update(GameTime gameTime)
    {
        // Allows the game to exit
        if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
            this.Exit();
        Keys[] pressedKeys = Keyboard.GetState().GetPressedKeys();
        for (int i = 0; i < pressedKeys.Length; i++)
        {
            if (pressedKeys[i] == Keys.W)
            {
                point.Y--;
            }
            else if (pressedKeys[i] == Keys.A)
            {
                point.X--;
            }
            else if (pressedKeys[i] == Keys.S)
            {
                point.Y++;
            }
            else if (pressedKeys[i] == Keys.D)
            {
                point.X++;
            }
        }
        myViewport.X = (int)point.X;
        myViewport.Y = (int)point.Y;
        GraphicsDevice.Viewport = myViewport;
        // TODO: Add your update logic here

        base.Update(gameTime);
    }

    /// <summary>
    /// This is called when the game should draw itself.
    /// </summary>
    /// <param name="gameTime">Provides a snapshot of timing values.</param>
    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.White);
        spriteBatch.Begin();
        spriteBatch.Draw(t, new Vector2(point.X, point.Y), Color.White);
        spriteBatch.End();
        // TODO: Add your drawing code here

        base.Draw(gameTime);
    }

1 Ответ

5 голосов
/ 14 февраля 2011

Прежде всего, вы, вероятно, должны установить Viewport в вашей функции Draw. Во-вторых, вы должны убедиться, что границы вашего Viewport всегда остаются на экране!

В любом случае, причина, по которой он движется подобным образом, заключается в том, что система координат SpriteBatch в пространстве клиента в терминах области просмотра .

Другими словами, позиция (0,0), согласно SpriteBatch, является верхним левым углом GraphicsDevice.Viewport.

Вот почему ваш спрайт движется с удвоенной скоростью, которую вы ожидаете, потому что вы фактически делаете две разные операции, изменяя его позицию рендеринга.

...