通过这样做,我在游戏中限制了每秒的帧数。
graphics.SynchronizeWithVerticalRetrace = false;
IsFixedTimeStep = false;
但现在我的 sprite/player 移动速度比以前快多了。我不知道它为什么会这样,我也不确定如何解决它。
if (keyboard.IsKeyDown(Keys.W) || keyboard.IsKeyDown(Keys.Up))
{
position.Y -= spd;
}
if (keyboard.IsKeyDown(Keys.A) || keyboard.IsKeyDown(Keys.Left))
{
position.X -= spd;
}
if (keyboard.IsKeyDown(Keys.S) || keyboard.IsKeyDown(Keys.Down))
{
position.Y += spd;
}
if (keyboard.IsKeyDown(Keys.D) || keyboard.IsKeyDown(Keys.Right))
{
position.X += spd;
}
这就是我目前让 Sprite 移动的方式。 spd = 4
目前。它工作得很好,但现在它的移动速度似乎快了 2000 倍。只需轻按其中一个键,他就会离开屏幕。
我们将不胜感激。
最佳答案
XNA 中的游戏循环基于更新和绘制。固定时间步长也指更新,因此通过将其设置为 false,您告诉更新尽可能频繁地被调用。由于您的代码在更新功能中,它被调用的次数超过默认值,每秒固定 60 次。
不只是使用 spd,而是将其更改为
spd * (gameTime.ElapsedGameTime.Milliseconds / 16);
这将改变它,以便 spd 按耗时缩放。 16 是更新在 60 fps(大约)下花费的毫秒数,这是您的 spd 值当前工作的值。
编辑:对于不是 Game.cs 的一部分:
更新您有兴趣移动的类(class)(我将称之为 Ship,但它可以是任何您想要的)
class Ship
{
public void Update(GameTime gameTime)
{
...
position.Y += spd * (gameTime.ElapsedGameTime.Milliseconds / 16);
...
}
..
}
然后在Game.cs文件中:
public override Update(GameTime gameTime)
{
myShip.Update(gameTime);
...
}
myShip 是您要移动的 Sprite 类的变量。注意更新不再覆盖基方法,因此对 base.Update 的调用也消失了
关于c# - 无限帧率后 Sprite 移动太快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10200956/