c# - 无限帧率后 Sprite 移动太快

标签 c# xna sprite frame-rate

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

graphics.SynchronizeWithVerticalRetrace = false;
IsFixedTimeStep = false;

但现在我的 sprite/player 移动速度比以前快多了。我不知道它为什么会这样,我也不确定如何解决它。

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;
}

这就是我目前让 Sprite 移动的方式。 spd = 4 目前。它工作得很好,但现在它的移动速度似乎快了 2000 倍。只需轻按其中一个键,他就会离开屏幕。

我们将不胜感激。

最佳答案

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

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

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

这将改变它,以便 spd 按耗时缩放。 16 是更新在 60 fps(大约)下花费的毫秒数,这是您的 spd 值当前工作的值。

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

更新您有兴趣移动的类(class)(我将称之为 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 是您要移动的 Sprite 类的变量。注意更新不再覆盖基方法,因此对 base.Update 的调用也消失了

关于c# - 无限帧率后 Sprite 移动太快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10200956/

相关文章:

c# - 在不更新 Database First Entity Framework MVC 应用程序中的其他模型的情况下向模型 (edmx) 添加新表

javascript - grunt-spritesmith 配置在 gruntfile.js 上无法正常工作

css - 使用动画 gif 作为 CSS Sprite 是一个好习惯吗?

css - 我怎样才能对 css sprite 图像做悬停效果?

c#方法继承直接子

C# 在不知道类型的情况下返回类型

c# - 类型函数<类型>()

c# - Monogame - 如何使 if 语句循环?

XNA Zune HD 应用程序无法正常退出

c# - MVVM Hierarchical Navigation 教程 StackOverFlow 异常