【问题标题】:sprite moves too fast after I unlimited the frame rate在我限制帧速率后精灵移动太快
【发布时间】:2012-04-29 08:48:03
【问题描述】:

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

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

我们将不胜感激。

【问题讨论】:

  • 编写与帧速率无关的代码的令人信服的理由
  • @bkconrad:显然 OP 从未尝试过,也许从未听说过这个概念。
  • -1 请在询问此类问题之前尝试完成并理解一些基本教程。此外,一个简单的搜索就可以提供答案和其他额外信息。

标签: c# xna sprite frame-rate


【解决方案1】:

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

【讨论】:

  • 我得到了错误。运算符“/”不能应用于“int”和“System.TimeSpan”类型的操作数
  • 这就是我想不到的写作!抱歉,应该是:spd * (gameTime.ElapsedGameTime.Milliseconds / 16);
  • 我还补充说@KendallFrey 解决方案更优雅。您应该以秒而不是帧来定义它,但我的应该适用于您当前拥有的速度值。如果您从头开始编写这样的代码,我同意它应该是每秒的距离
  • @Venatu 现在我收到错误消息。 “你调用的对象是空的。”但这只有在我运行它然后按下键之后才会发生。
  • @IanLundberg 我猜 gameTime 不是您在更新定义中作为参数名称的内容。您可以发布覆盖更新的行吗?
【解决方案2】:

当您关闭固定时间步长时,您需要在计算中加入时间增量才能控制移动。例如:

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

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

【讨论】:

  • spd 乘以 TotalSeconds 时,整数环绕的风险是什么?
  • @sarnold:没有。你会得到一个double。
  • @KendallFrey 我收到错误消息“对象引用未设置为对象的实例。”在我运行它之后,然后按 Key。
  • @Ian:使用调试器。找出什么是null。然后在这里发布。
猜你喜欢
  • 1970-01-01
  • 2019-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-08
  • 2020-03-28
  • 2020-04-07
  • 1970-01-01
相关资源
最近更新 更多