游戏引擎中的运动是如何工作的
How does movement in a game engine work
//Calculate time step
float timeStep = stepTimer.getTicks() / 1000.f;
//Move for time step
dot.move( timeStep );
//Restart step timer
stepTimer.start();
这段取自 Lazy Foo 的 SDL 教程的代码应该会产生一个基于可变时间步长的运动系统。我对此的主要问题是它是如何工作的? float timeStep = stepTimer.getTicks() / 1000.f;
以 秒 计算经过的时间。因此,如果假设自上次移动调用以来已过去 2 毫秒,则 timeStep var 将为 0.02 秒。这怎么可能在代码中使用?如果我有每秒 10 像素的恒定速度并且我想让该速度适用于任何帧率,我必须将我的 px/s 乘以该值 (0.02)。
然而,这将导致以下 posx += 10*0.02
。正如我们刚刚了解到的,这意味着我们将位置增加 0.2 像素的值(这当然不会起作用,它只会降低值)。
我在这里错过了什么?
根据你的问题,我了解到你将对象的位置存储为整数坐标,表示它位于哪个像素。所以你的问题的答案就是不要那样做。将位置存储为浮点值,可能代表像素的一部分,或者您要使用的任何其他测量值。如果您的绘图系统需要整数像素坐标,您可以简单地转换为绘图阶段的像素坐标。
您在代码中维护了一个位置变量;一个浮点值,它是精确的并且接受微小的变化,低至有效位数(32 位浮点数为 7,64 位浮点数为 14)。
然后你从那里画到屏幕上。
一段时间后,它会被翻译(或者说四舍五入)到一个像素,一段时间后到相邻像素,等等。
你错误的是你使用(或以这种方式解释)像素地址作为位置数据。一个屏幕只有非常有限的"numeric space"。考虑仅使用 0 到 2000 之间的整数进行任何数学运算。不会带你走远。
//Calculate time step
float timeStep = stepTimer.getTicks() / 1000.f;
//Move for time step
dot.move( timeStep );
//Restart step timer
stepTimer.start();
这段取自 Lazy Foo 的 SDL 教程的代码应该会产生一个基于可变时间步长的运动系统。我对此的主要问题是它是如何工作的? float timeStep = stepTimer.getTicks() / 1000.f;
以 秒 计算经过的时间。因此,如果假设自上次移动调用以来已过去 2 毫秒,则 timeStep var 将为 0.02 秒。这怎么可能在代码中使用?如果我有每秒 10 像素的恒定速度并且我想让该速度适用于任何帧率,我必须将我的 px/s 乘以该值 (0.02)。
然而,这将导致以下 posx += 10*0.02
。正如我们刚刚了解到的,这意味着我们将位置增加 0.2 像素的值(这当然不会起作用,它只会降低值)。
我在这里错过了什么?
根据你的问题,我了解到你将对象的位置存储为整数坐标,表示它位于哪个像素。所以你的问题的答案就是不要那样做。将位置存储为浮点值,可能代表像素的一部分,或者您要使用的任何其他测量值。如果您的绘图系统需要整数像素坐标,您可以简单地转换为绘图阶段的像素坐标。
您在代码中维护了一个位置变量;一个浮点值,它是精确的并且接受微小的变化,低至有效位数(32 位浮点数为 7,64 位浮点数为 14)。
然后你从那里画到屏幕上。
一段时间后,它会被翻译(或者说四舍五入)到一个像素,一段时间后到相邻像素,等等。
你错误的是你使用(或以这种方式解释)像素地址作为位置数据。一个屏幕只有非常有限的"numeric space"。考虑仅使用 0 到 2000 之间的整数进行任何数学运算。不会带你走远。