1

昨天我在 XNA 中使用视口做一些事情,但无法弄清楚为什么我使用的精灵在更改位置时比我的视口移动得更快。我有一种感觉,它可能与不同的值类型(int vs. 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);
    }
4

1 回答 1

5

首先,您可能应该在 Draw 函数中设置 Viewport。其次,您应该确保您的视口边界始终保持在屏幕上!

无论如何,它这样移动的原因是因为 SpriteBatch 的坐标系在 Viewport 方面位于客户端空间中

换句话说,根据 ,位置 (0,0)SpriteBatch是 的左上角GraphicsDevice.Viewport

这就是为什么您的精灵以您期望的两倍速度移动的原因,因为您实际上是在执行两种不同的操作来修改其渲染位置。

于 2011-02-14T07:59:59.377 回答