C ++控制台

时间:2015-07-17 02:54:52

标签: c++ windows c++11 visual-c++

有没有办法在不使用第三方库的情况下,在简单的C ++控制台应用程序中增加/减少变量的值与实时相对应。

对于,例如在Unity3D游戏引擎中,有一个名为Time.DeltaTime的东西,它给出了完成最后一帧所花费的时间。现在,我知道控制台应用程序中没有绘制更新函数或框架,但我正在尝试做的是能够增加/减少变量的值,使其相对于时间变化,

  

变量= 0
  变量=变量+ Time.DeltaTime

使变量值每秒递增。在C ++ 11中是否可以这样?所以,比如说速度是5,那么5秒后变量的值为5。

基本上,我正在创建一个简单的粒子系统,我希望粒子在达到MAX_AGE后死亡。我不确定如何在一个简单的C ++控制台应用程序中实现它。

2 个答案:

答案 0 :(得分:0)

对于简单的时间安排,您可以使用std::chrono::system_clocktbb::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;

}