通过这样做,我可以在游戏中每秒限制帧数。
graphics.SynchronizeWithVerticalRetrace = false;
IsFixedTimeStep = false;
但是现在我的子画面/播放器的移动速度比以前快。我不知道为什么要这样做,而且我不确定如何解决。
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;
}
目前,这就是我让精灵移动的方式。目前是
spd = 4
。它工作得很好,但是现在看来它的运行速度快了2000倍。只需轻按其中一个键即可将他带出屏幕。任何和所有帮助将不胜感激。
最佳答案
XNA中的游戏循环基于更新和绘制。固定时间步长也指更新,因此将其设置为false可以告诉更新被尽可能频繁地调用。由于您的代码位于更新功能中,因此它的调用速度超过了默认值,每秒固定60次。
而不是仅使用spd,将其更改为
spd * (gameTime.ElapsedGameTime.Milliseconds / 16);
这将改变它,以便使spd按经过的时间缩放。 16是更新速度为60 fps(大约)时所花费的毫秒数,这是您的spd值当前正在使用的值。
编辑:不属于Game.cs:
对您感兴趣的班级进行更新(我将其称为“轮船”,但可能是您想要的任何东西)
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是您要移动的精灵类的变量。注意update不再覆盖基本方法,因此对base.Update的调用也消失了