开发者

Sprite Position Moves Faster than Viewport

开发者 https://www.devze.com 2023-02-10 11:09 出处:网络
I was doing some things with a viewport yesterday in XNA, and couldn\'t开发者_Go百科 figure out why the sprite I\'m using moves faster than my viewport when changing the positions.I had a feeling that

I was doing some things with a viewport yesterday in XNA, and couldn't开发者_Go百科 figure out why the sprite I'm using moves faster than my viewport when changing the positions. I had a feeling that it may have something to do with the different value types (int vs. float), but would someone care to elaborate on this?

Here's the code I was using...

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


First of all, you should probably be setting the Viewport in your Draw function. Second of all you should ensure that your Viewport bounds always remain on screen!

Anyway, the reason it moves like that is because SpriteBatch's coordinate system is in client space in terms of the Viewport.

In other words, the position (0,0), according to SpriteBatch, is the top left corner of the GraphicsDevice.Viewport.

This is why your sprite moves at twice the speed you expect, because you're effectively doing two different operations modifying its rendering position.

0

精彩评论

暂无评论...
验证码 换一张
取 消