通过这样做,我可以在游戏中每秒限制帧数。

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的调用也消失了

08-15 22:28