用游戏时间移动精灵,为什么我需要使用 +=



我正在尝试使用变量 gameTime.ElapsedGameTime.TotalMilliseconds;

更新工作精灵位置的代码是这样的:

spritePosition.X += (float)gameTime.ElapsedGameTime.TotalMilliseconds;

上面一行中,子画面在运行时按预期向右移动。

但是我不明白为什么我需要"+="。 即为什么以下方法不起作用:

spritePosition.X = (float)gameTime.ElapsedGameTime.TotalMilliseconds;

(我知道 x += 1 是 x = x + 1 的简写)

我正在将gameTime传递给更新功能,它不应该不断变化(因此不断移动精灵)吗?我觉得我错过了一些直截了当的东西!

编辑:精灵不加速。(我可以使用秒而不是毫秒来测试这一点,它显然只以每秒 1 个像素的速度移动,而不是加速)

信息:

语言: C#我正在使用XNA窗口游戏模板上面的单行在更新函数中调用

这是因为gameTime.ElapsedGameTime是自最后一个"帧"以来经过的时间。 这意味着如果您以 60fps 的速度运行,它将始终约为 6/60 秒。

您正在将位置设置为常量值。

请参阅以下说明:http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.gametime.elapsedgametime.aspx

gameTime.ElapsedGameTime是自上次更新以来的时间。因此,您需要添加此增量 +=。您将使用 = 表示绝对时间 ( gameTime.TotalGameTime )。

您需要ElapsedGameTime,因为您不知道调用更新的频率。因此,如果你想要恒定的速度,比如说 1000px/s,你每秒只得到 1 次更新调用(例如慢 cpu),ElapsedGameTime每次将是 1000 毫秒,你将每秒移动 1000 像素的精灵。

如果你得到 50fps(所以每秒 50 次更新调用),ElapsedGameTime将始终是 20 毫秒,并且你每秒移动 50 * 20 毫秒 = 1000 像素。

这样,您无需关心CPU的滞后或速度。

在你的例子中,这并不重要。由于您只进行线性移动,因此您可以使用Position.X = TotalGameTime并且它会做同样的事情。但是,当您需要根据自上次更新以来自己的速度确定精灵移动了多远时,您将需要Position += ElapsedGameTime * (object/sprite speed)

区别在于

+=添加到spritePosition.X的当前值,而=只是分配一个新值。

如果 spritePosition.X 的值为 5gameTime.ElapsedGameTime.TotalMilliseconds的值为 10(为了此参数),则第一行代码的计算结果为:

spritePosition.X += (float)gameTime.ElapsedGameTime.TotalMilliseconds;
spritePosition.X = spritePosition.X + (float)gameTime.ElapsedGameTime.TotalMilliseconds;
spritePosition.X = 5 + (float)10;  // 15

而第二个计算结果为:

spritePosition.X = (float)gameTime.ElapsedGameTime.TotalMilliseconds;
spritePosition.X = (float)10;      // 10

最新更新