【问题标题】:How does movement in a game engine work游戏引擎中的运动如何工作
【发布时间】:2016-07-31 18:49:55
【问题描述】:
   //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 像素(这当然不会起作用,它只会降低值)。

我在这里错过了什么?

【问题讨论】:

    标签: c++ sdl frame-rate


    【解决方案1】:

    您在代码中维护一个位置变量;一个浮点值,它是精确的并且接受微小的变化,直到有效位数(32 位浮点数为 7,64 位浮点数为 14)。

    然后你从那里画到屏幕上。

    一段时间后,它会被转换(或者说是四舍五入)到一个像素,一段时间后会转换到相邻的像素,等等。

    您的错误在于您使用(或以这种方式解释)像素地址作为位置数据。屏幕只有高度有限的“数字空间”。考虑仅使用 0 到 2000 之间的整数进行任何数学运算。不会带你走太远。

    【讨论】:

      【解决方案2】:

      根据您的问题,我认为您将对象的位置存储为一个整数坐标,表示它位于哪个像素。所以你的问题的答案是根本不这样做。将位置存储为浮点值,可能代表像素的一部分,或者您想要使用的任何其他测量值。如果您的绘图系统需要整数像素坐标,您可以简单地将其转换为绘图阶段。

      【讨论】:

        猜你喜欢
        • 2018-07-02
        • 1970-01-01
        • 2016-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-09
        • 1970-01-01
        • 2022-01-12
        相关资源
        最近更新 更多