2010-06-04 63 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