我昨天在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 :(得分:5)
首先,您可能应该在Draw功能中设置视口。其次,您应确保您的视口界限始终保留在屏幕上!
无论如何,它移动的原因是因为SpriteBatch的坐标系在客户端空间中就视口而言是。
换句话说,根据SpriteBatch
,位置(0,0)位于GraphicsDevice.Viewport
的左上角。
这就是为什么你的精灵以你期望的速度移动两倍的原因,因为你正在有效地做两个不同的操作来修改它的渲染位置。