2011-02-13 28 views
1

昨天在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); 
    } 
+0

使用`GetPressedKeys`让我想用叉子刺出我的眼睛。请存储键盘状态(`KeyboardState ks = Keyboard.GetState()`),然后查询它(`if(ks.IsKeyDown(Keys.W)`等),删除循环和“其他” – 2011-02-14 07:35:37

回答

5

首先,你应该在你的绘图功能设置视口。其次,你应该确保你的视口边界始终保持在屏幕上!

无论如何,它这样移动的原因是因为SpriteBatch的坐标系在客户端空间中是,就视口而言。

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

这就是为什么你的精灵以你期望的速度移动两倍,因为你有效地做了两个不同的操作来修改它的渲染位置。