有没有办法在不使用第三方库的情况下,在简单的C ++控制台应用程序中实时增加/减lessvariables的值。
例如在Unity3D游戏引擎中,有一些叫做Time.DeltaTime的东西给出了完成最后一帧的时间。 现在,我明白,在控制台应用程序中没有绘制更新函数或框架,但是我正在尝试做的是能够递增/递减variables的值,使得它随着时间的变化而变化,
variables= 0
variables=variables+ Time.DeltaTime
以便variables值每秒递增。 在C ++ 11中是这样的吗? 所以说,如果速度是5,那么在5秒之后,variables的值是5。
基本上,我正在创build一个简单的粒子系统,我希望粒子在达到MAX_AGE后死亡。 我不知道如何在一个简单的C ++控制台应用程序中实现。
对于简单的时间,你可以使用std :: chrono :: system_clock 。 tbb :: tick_count是一个更好的delta计时器,但你说没有第三方库。
如你所知,德尔塔时间是最后的时间,减去原来的时间。
dt= t-t0
然而,这个增量时间只是速度变化时经过的时间量。
函数的导数表示函数的一个变量的无穷小变化。 函数关于变量的导数被定义为
f(x + h) - f(x) f'(x) = lim ----------------- h->0 h
首先你得到一个时间, 即 NewTime = timeGetTime()
。
然后你从刚刚得到的新时间中减去旧时间。 称之为增量时间, dt
。
OldTime = NewTime; dt = (float) (NewTime - OldTime)/1000;
现在你把dt
加到totaltime
。
TotalTime += dt
所以当TotalTime
达到5时,就结束了粒子的寿命。
if(TotalTime >= 5.0f){ //particles to die after their MAX_AGE is reached TotalTime=0; }
…
更有趣的阅读:
http://gafferongames.com/game-physics/
http://gafferongames.com/game-physics/integration-basics/
…
Windows示例代码:
#include<time.h> #include<stdlib.h> #include<stdio.h> #include<windows.h> #pragma comment(lib,"winmm.lib") void gotoxy(int x, int y); void StepSimulation(float dt); int main(){ int NewTime = 0; int OldTime = 0; int StartTime = 0; int TimeToLive = 5000; //// TimeToLive 5 seconds float dt = 0; float TotalTime = 0; int FrameCounter = 0; int RENDER_FRAME_COUNT = 60; // reset TimeToLive StartTime = timeGetTime(); while(true){ NewTime = timeGetTime(); dt = (float) (NewTime - OldTime)/1000; //delta time OldTime = NewTime; // print to screen TimeToLive gotoxy(1,1); printf("NewTime - StartTime = %d ", NewTime - StartTime ); if ( (NewTime - StartTime ) >= TimeToLive){ // reset TimeToLive StartTime = timeGetTime(); } // The rest of the timestep and 60fps lock if (dt > (0.016f)) dt = (0.016f); //delta time if (dt < 0.001f) dt = 0.001f; TotalTime += dt; if(TotalTime >= 5.0f){ TotalTime=0; StepSimulation(dt); } if(FrameCounter >= RENDER_FRAME_COUNT){ // draw stuff //Render(); gotoxy(1,3); printf("OldTime = %d \n",OldTime); printf("NewTime = %d \n",NewTime); printf("dt = %f \n",dt); printf("TotalTime = %f \n",TotalTime); printf("FrameCounter = %d fps\n",FrameCounter); printf(" \n"); FrameCounter = 0; } else{ gotoxy(22,7); printf("%d ",FrameCounter); FrameCounter++; } } return 0; } void gotoxy(int x, int y){ COORD coord; coord.X = x; coord.Y = y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); return; } void StepSimulation(float dt){ // calculate stuff //vVelocity += Ae * dt; }