在我限制帧速率后,精灵移动太快

时间:2012-04-18 00:08:03

标签: c# xna sprite frame-rate

我在游戏中每秒限制帧数。

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倍。只需轻按其中一个键即可将其关闭。

任何和所有帮助将不胜感激。

2 个答案:

答案 0 :(得分:4)

XNA中的游戏循环基于更新和绘制。固定时间步也指更新,因此通过将其设置为false,您将告知更新尽可能经常被调用。由于您的代码位于更新功能中,因此其被调用超过默认值,每秒固定60次。

而不是仅使用spd,将其更改为

spd * (gameTime.ElapsedGameTime.Milliseconds / 16);

这会改变它,以便spd按经过的时间缩放。 16是更新以60 fps(大约)为单位的毫秒数,这是您的spd值当前工作的值。

编辑:不是Game.cs的一部分:

有关于您感兴趣的课程的更新(我将其称为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是您要移动的精灵类的变量。注意更新不再覆盖基本方法,因此对base.Update的调用也消失了

答案 1 :(得分:4)

当您关闭固定的时间步长时,您需要将时间增量计算到计算中以对运动进行任何控制。例如:

if (keyboard.IsKeyDown(Keys.W) || keyboard.IsKeyDown(Keys.Up))
{
    position.Y -= spd * gameTime.ElapsedGameTime.TotalSeconds;
}
...

在这种情况下,您可以将spd设置为每的距离,而不是每