我在游戏中每秒限制帧数。
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倍。只需轻按其中一个键即可将其关闭。
任何和所有帮助将不胜感激。
答案 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
设置为每秒的距离,而不是每帧。