2

我通过这样做来限制游戏中的每秒帧数。

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 倍。只需轻按其中一个键,他就会离开屏幕。

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

4

2 回答 2

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 是您要移动的精灵类的变量。注意 update 不再覆盖基本方法,因此对 base.Update 的调用也消失了

于 2012-04-18T00:14:11.687 回答
4

当您关闭固定时间步长时,您需要将时间增量纳入计算以控制移动。例如:

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

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

于 2012-04-18T00:22:01.773 回答