现在假如你想要为某事计时30秒,但是你没有停表。如果有一个带秒针的时钟挂在墙上,你会等它到了15秒的倍数:
然后你会一直等到秒针到达从起点向前30秒的地方。
这里的计时器使用了相同的原理。SDL在你的程序里运行了一个计时器,你可以通过
然后你会一直等到秒针到达从起点向前30秒的地方。
这里的计时器使用了相同的原理。SDL在你的程序里运行了一个计时器,你可以通过
SDL_GetTicks()获取它的时间,结果以毫秒为单位。如果你想为了某事计时1000毫秒,你会先保存开始时间,然后一直等到当前时间与开始时间相差1000毫秒的时刻。//头文件 #include "SDL/SDL.h" #include "SDL/SDL_image.h" #include "SDL/SDL_ttf.h" #include <string> #include <sstream>
除了通常使用的头文件,我们还包含了string stream的头文件。我会在后面解释string stream的作用。
int main( int argc, char* args[] )
{
//退出标志
bool quit = false;
//计时器启动时间
Uint32 start = 0;
//计时器的启动/停止标志
bool running = true;
在我们的主函数的顶部,我们有两个将要用于制作计时器的变量。其中,“start”变量保存了计时器启动的时间,"running"标志跟踪了计时器是否正在运行。
//启动计时器
start = SDL_GetTicks();
//当用户还没有退出时
while( quit == false )
{
当我们完成初始化并加载好表面时,是时候启动计时器了。
我们通过调用
我们通过调用
SDL_GetTicks()获得当前时间并启动计时器,然后进入我们的主循环。 //当有事件需要处理
while( SDL_PollEvent( &event ) )
{
//如果有一个按键被按下
if( event.type == SDL_KEYDOWN )
{
//如果“s”被按下
if( event.key.keysym.sym == SDLK_s )
{
//如果计时器正在运行
if( running == true )
{
//停止计时器
running = false;
start = 0;
}
else
{
//启动计时器
running = true;
start = SDL_GetTicks();
}
}
}
这里我们处理了“s”键被按下的事件,此时我们启动或停止计时器。
如果计时器正在运行,我们将"running"标志设为false,然后将start设为0,这么做是因为我不喜欢杂散值。如果计时器已经停止,我们将"running"标志设为true,然后使用我们在进入主循环前所采用的方式启动计时器。
如果计时器正在运行,我们将"running"标志设为false,然后将start设为0,这么做是因为我不喜欢杂散值。如果计时器已经停止,我们将"running"标志设为true,然后使用我们在进入主循环前所采用的方式启动计时器。
//如果计时器正在运行
if( running == true )
{
//以string形式存储的计时器时间
std::stringstream time;
//将计时器时间转换为string
time << "Timer: " << SDL_GetTicks() - start;
在我们应用完背景表面和信息表面后,我们检查一下计时器是否正在运行。如果是的,我们将计时器时间显示出来。
计算计时器时间的公式是:
所以这里我们将"Timer: " + 计时器时间传入string stream中。
我们创建了一个叫做“time”的string stream对象,它保存了计时器的信息。String stream对象允许你传入不同类型的变量来构造string。就和你看到的一样,它的功能类似于cout,但它不会将所有东西输出到控制台,而是将文本保存在string stream中,以供我们使用。
对于那些还在使用VC++ 6.0的人来说,你可能需要将SDL_GetTicks() - start转换成一个整数。
计算计时器时间的公式是:
计时时间 = 当前时间 - 开始时间
所以,如果你在SDL_GetTicks()返回10,000的时候启动计时器,并且现在SDL_GetTicks() 的结果为 20,000, 那么这个式子的运算结果是10,000,意味着从计时器启动时开始,已经经过了10秒钟的时间。所以这里我们将"Timer: " + 计时器时间传入string stream中。
我们创建了一个叫做“time”的string stream对象,它保存了计时器的信息。String stream对象允许你传入不同类型的变量来构造string。就和你看到的一样,它的功能类似于cout,但它不会将所有东西输出到控制台,而是将文本保存在string stream中,以供我们使用。
对于那些还在使用VC++ 6.0的人来说,你可能需要将SDL_GetTicks() - start转换成一个整数。
//渲染时间表面
seconds = TTF_RenderText_Solid( font, time.str().c_str(), textColor );
//应用时间表面
apply_surface( ( SCREEN_WIDTH - seconds->w ) / 2, 50, seconds, screen );
//释放时间表面
SDL_FreeSurface( seconds );
}
//更新窗口
if( SDL_Flip( screen ) == -1 )
{
return 1;
}
}
然后,我们使用string stream中的文本渲染出计时器时间,接着将其应用到窗口中,最后再将它释放。
在窗口更新后,我们继续执行主循环。
在窗口更新后,我们继续执行主循环。