#include "CTimer.h"
//---------------------- default constructor------------------------------
//
//-------------------------------------------------------------------------
CTimer::CTimer(): m_FPS(0),
m_TimeElapsed(0.0f),
m_FrameTime(0),
m_LastTime(0),
m_PerfCountFreq(0)
{
//how many ticks per sec do we get
QueryPerformanceFrequency( (LARGE_INTEGER*)&m_PerfCountFreq);
m_TimeScale = 1.0f/m_PerfCountFreq;
}
//---------------------- constructor-------------------------------------
//
//use to specify FPS
//
//-------------------------------------------------------------------------
CTimer::CTimer(float fps): m_FPS(fps),
m_TimeElapsed(0.0f),
m_LastTime(0),
m_PerfCountFreq(0)
{
//how many ticks per sec do weget
QueryPerformanceFrequency( (LARGE_INTEGER*)&m_PerfCountFreq);
m_TimeScale =1.0f/m_PerfCountFreq;
//calculate ticks perframe
m_FrameTime = (LONGLONG)(m_PerfCountFreq /m_FPS);
}
//------------------------Start()-----------------------------------------
//
//call this immediately prior to game loop.Starts the timer (obviously!)
//
//--------------------------------------------------------------------------
void CTimer::Start()
{
//get the time
QueryPerformanceCounter( (LARGE_INTEGER*)&m_LastTime);
//update time to render next frame
m_NextTime = m_LastTime + m_FrameTime;
return;
}
//-------------------------ReadyForNextFrame()-------------------------------
//
//returns true if it is time to move on to thenext frame step. To be used if
//FPS is set.
//
//----------------------------------------------------------------------------
bool CTimer::ReadyForNextFrame()
{
if (!m_FPS)
{
MessageBox(NULL, "No FPS set in timer", "Doh!", 0);
returnfalse;
}
QueryPerformanceCounter( (LARGE_INTEGER*)&m_CurrentTime);
if (m_CurrentTime >m_NextTime)
{
m_TimeElapsed=(m_CurrentTime - m_LastTime) * m_TimeScale;
m_LastTime=m_CurrentTime;
//update time to render nextframe
m_NextTime = m_CurrentTime +m_FrameTime;
return true;
}
return false;
}
//--------------------------- TimeElapsed--------------------------------
//
//returns time elapsed since last call to thisfunction. Use in main
//when calculations are to be based on dt.
//
//-------------------------------------------------------------------------
double CTimer::TimeElapsed()
{
QueryPerformanceCounter( (LARGE_INTEGER*)&m_CurrentTime);
m_TimeElapsed= (m_CurrentTime -m_LastTime) * m_TimeScale;
m_LastTime=m_CurrentTime;
return m_TimeElapsed;
}
CTIMER.H
----------------
#ifndef CTIMER_H
#define CTIMER_H
//-----------------------------------------------------------------------
//
// Name: CTimer.h
//
// Author: Mat Buckland 2002
//
//Desc: Windows timer class for the book GameAI
// Programming with Neural Nets and GeneticAlgorithms.
//
//-----------------------------------------------------------------------
#include<windows.h>
class CTimer
{
private:
LONGLONGm_CurrentTime,
m_LastTime,
m_NextTime,
m_FrameTime,
m_PerfCountFreq;
doublem_TimeElapsed,
m_TimeScale;
floatm_FPS;
public:
//ctors
CTimer();
CTimer(float fps);
//whatdayaknow, this starts the timer
voidStart();
//determines if enough time has passed to moveonto next frame
boolReadyForNextFrame();
//only use this after a call to theabove.
doubleGetTimeElapsed(){returnm_TimeElapsed;}
doubleTimeElapsed();
};
#endif