有没有办法在不使用第三方库的情况下,在简单的C ++控制台应用程序中增加/减少变量的值与实时相对应。
对于,例如在Unity3D游戏引擎中,有一个名为Time.DeltaTime的东西,它给出了完成最后一帧所花费的时间。现在,我知道控制台应用程序中没有绘制更新函数或框架,但我正在尝试做的是能够增加/减少变量的值,使其相对于时间变化,
变量= 0
变量=变量+ Time.DeltaTime
使变量值每秒递增。在C ++ 11中是否可以这样?所以,比如说速度是5,那么5秒后变量的值为5。
基本上,我正在创建一个简单的粒子系统,我希望粒子在达到MAX_AGE后死亡。我不确定如何在一个简单的C ++控制台应用程序中实现它。
答案 0 :(得分:0)
对于简单的时间安排,您可以使用std::chrono::system_clock。 tbb::tick_count是一个更好的增量计时器,但您没有说第三方库。
答案 1 :(得分:0)
如您所知,增量时间是最终时间,减去原始时间。
dt= t-t0
这个增量时间只是速度变化时经过的时间量。
函数的导数表示函数相对于其变量之一的无穷小变化。函数相对于变量的导数定义为
f(x + h) - f(x)
f'(x) = lim -----------------
h->0 h
首先,你得到一个时间,即 NewTime = timeGetTime()
。
然后从刚刚获得的新时间中减去旧时间。称之为delta时间,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;
}