用游戏时间移动精灵,为什么我需要使用 +=
本文关键字:为什么 游戏时间 移动 精灵 | 更新日期: 2024-10-30 09:48:09
我正在尝试使用变量 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
的值为 5
,gameTime.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