基于时间的运动滑动物体

时间:2018-04-20 11:08:53

标签: c++

目前我有一个基于FPS移动对象的功能,如果框架没有通过它就不会做任何事情。

如果计算机可以以这样的速度运行它,它可以正常工作。

我如何使用时间并根据时间移动它?

这是我的代码:

{{1}}

2 个答案:

答案 0 :(得分:0)

您可以按时差更新对象。我们需要有开始时间戳,然后计算全局循环的每次迭代的差异。所以全局循环也很重要,它必须一直工作。我的示例显示了对象的调用更新方法。所有对象都应该依赖于时间而不是FPS。 Fps在不同的计算机上显示不同的行为,甚至同一台计算机也可以显示不同的fps,因为其他进程在后台运行。

#include <iostream>
#include <chrono>
#include <unistd.h>

//Function to update all objects
void Update( float dt )
{
    //For example
    //for( auto Object : VectorObjects )
    //{
    //    Object->Update(dt);
    //}
}

int main()
{
    typedef std::chrono::duration<float> FloatSeconds;
    auto OldMs = std::chrono::system_clock::now().time_since_epoch();

    const uint32_t SleepMicroseconds = 100;

    //Global loop
    while (true)
    {
        auto CurMs = std::chrono::system_clock::now().time_since_epoch();
        auto DeltaMs = CurMs - OldMs;
        OldMs = CurMs;

        //Cast delta time to float seconds
        auto DeltaFloat = std::chrono::duration_cast<FloatSeconds>(DeltaMs);

        std::cout << "Seconds passed since last update: " << DeltaFloat.count() << " seconds" << std::endl;

        //Update all object by time as float value.
        Update( DeltaFloat.count() );

        // Sleep to give time for system interaction
        usleep(SleepMicroseconds);

        // Any other actions to calculate can be here
        //...
    }

    return 0;
}

对于控制台中的此示例,您可以看到如下内容:

Seconds passed since last update: 0.002685 seconds
Seconds passed since last update: 0.002711 seconds
Seconds passed since last update: 0.002619 seconds
Seconds passed since last update: 0.00253 seconds
Seconds passed since last update: 0.002509 seconds
Seconds passed since last update: 0.002757 seconds

答案 1 :(得分:0)

您的时基逻辑似乎不正确,这是一个示例代码段。无论系统速度如何,物体的速度都应相同。而不是平台相关的QueryPerformanceFrequency,而是使用std :: chrono。

void animate(bool& stop)
{
    static float speed = 1080/5; // = 1080px/ 5sec = 5sec to cross screen
    static std::chrono::system_clock::time_point start = std::chrono::system_clock::now();
    float fps;
    int object_x = 1080;

    while(!stop)
    {
        //calculate factional time 
        auto now = std::chrono::system_clock::now();
        auto diff = now - start;
        auto lapse_milli = std::chrono::duration_cast<std::chrono::milliseconds>(diff);
        auto lapse_sec = lapse_milli.count()/1000;

        //apply to object
        int incr_x = speed * lapse_sec ;
        object_x -= incr_x;
        if( object_x <0) object_x = 1080;

        // render object here        

        fps = lapse_milli.count()/1000;
        //print fps

        std::this_thread::sleep_for(std::chrono::milliseconds(100)); // change to achieve a desired fps rate
        start = now;
    }

}