2010-06-04 80 views
1

所以在我的游戏中,我需要以硬件独立的方式模拟物理。与操作系统无关的C库,用于计算时间流逝?

我打算使用一个固定的时间步模拟,但我需要能够计算在多次调用之间传递多少时间。

我尝试这样做,毫无进展:

#include <time.h> 
double time_elapsed; 
clock_t last_clocks = clock(); 
while (true) { 
    time_elapsed = ((double) (clock() - last_clocks)/CLOCKS_PER_SEC); 
    last_clocks = clock(); 
    printf("%f\n", time_elapsed); 
} 

谢谢!

+1

您发布的代码有什么问题? – interjay 2010-06-04 20:52:54

+0

经过的时间始终是0 :( – Alexandre 2010-06-05 23:29:24

回答

3

您可以使用gettimeofday来获取秒数加上Epoch以来的微秒数。如果你想要的秒数,你可以做这样的事情:

#include <sys/time.h> 
float getTime() 
{ 
    struct timeval time; 
    gettimeofday(&time, 0); 
    return (float)time.tv_sec + 0.000001 * (float)time.tv_usec; 
} 

我误解你的问题在第一,但你会发现做一个固定的时间步长物理环路有用的下面的方法。

有两件事你需要做一个固定时间步物理循环。

首先,您需要计算从现在到上次运行物理的时间。

last = getTime(); 
while (running) 
{ 
    now = getTime(); 
    // Do other game stuff 
    simulatePhysics(now - last); 
    last = now; 
} 

然后,在物理模拟中,您需要计算一个固定的时间步长。

void simulatePhysics(float dt) 
{ 
    static float timeStepRemainder; // fractional timestep from last loop 
    dt += timeStepRemainder * SIZE_OF_TIMESTEP; 

    float desiredTimeSteps = dt/SIZE_OF_TIMESTEP; 
    int nSteps = floorf(desiredTimeSteps); // need integer # of timesteps 

    timeStepRemainder = desiredTimeSteps - nSteps; 

    for (int i = 0; i < nSteps; i++) 
     doPhysics(SIZE_OF_TIMESTEP); 

} 

使用这种方法,你可以给无论是做物理(doPhysics在我的例子)一个固定的时间步长,同时保持实时和游戏时间之间的同步,通过计算时间步长的权数自上次模拟实时物理运行。

+0

现在 - 最后保持在返回0 :( \t浮子现在= GET_TIME(); 浮子TIME_ELAPSED =现在 - 时间:LAST_TIMEBREAK; 的printf( “%F \ n” 个, time_elapsed); last_time = now; \t usleep(1000000); 打印0.00000,0.0000,... – Alexandre 2010-06-06 00:01:13