如果想实现用手遮住标识卡,将手撤回后,就可以切换另外一个模型的功能,那么应该怎么做呢?可以利用手遮住标识再撤回的这段时间来实现该功能。查阅资料得到#include<time.h>是C/C++中的日期和时间头文件,用于需要时间方面的函数,其中从系统时钟获取时间方式有2种方式。
①time_t time(time_t *timer);
函数功能:得到机器的日历时间或者设置日历时间
函数返回:机器日历时间
参数说明:timer=NULL时得到机器日历时间,timer=时间数值时,用于设置日历时间,time_t是一个long int类型
②clock_t clock(void);
返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元(clock tick)数(挂钟时间),返回单位是毫秒,clock_t是一个long
int类型。
图1 遮盖标识再撤回
下面就来看一下代码怎么实现。(我是在在simpleTest.c的基础上修改的)
(1)切换2个模型
思路:可以定义一个函数,使标志量在0、1这2种状态之间变换,根据标志量的值用opengl绘制图形。
先在声明部分加上下面的代码。
#include<time.h>//时间函数
#define State(n) ((n)=!(n))//用来改变n的值,使n在0和1之间变换(只有2中状态的时候可以这样用)
然后在static void draw( void )函数部分加上以下代码。
static void draw( void )
{
…………
…………
…………
static int flag=0;//初始状态为0(注意:一定要加上static,否则只显示1个模型或显示0个模型)
static time_t dwLast=0;//时间值time_t为长整型(long int)的别名,要给dwLast赋初值,否则会报错
…………
…………
…………
…………
…………
…………
//glTranslatef( 0.0, 0.0, 25.0 );
//glutSolidCube(50.0);
//clock()表示从程序启动到当前时刻所经历的CPU时钟周期数。
if(clock()-dwLast>100)
State(flag);
if(flag==0)
glutSolidSphere(50,150,150);//flag=0,绘制球体
else
glutSolidCube(50.0);//flag=1,绘制正方体
glDisable( GL_LIGHTING );
glDisable( GL_DEPTH_TEST );
dwLast=clock();
}
运行结果如图2所示。
图2 切换2个模型
(2)切换4个模型
思路:用求余函数,使标志量在0、1、2、3这4种状态之间变换,根据标志量的值用opengl绘制图形。
先在声明部分加上下面的代码。
#include<time.h>//时间函数
然后在static void draw( void )函数部分加上以下代码。static void draw( void )
{
…………
…………
…………
static int flag=-1;//初始状态为-1(注意:一定要加上static,否则只显示1个模型或显示0个模型)
static time_t dwLast=0;//时间值time_t为长整型(long int)的别名,要给dwLast赋初值,否则会报错
…………
…………
…………
…………
…………
…………
//glTranslatef( 0.0, 0.0, 25.0 );
//glutSolidCube(50.0);
//clock()表示从程序启动到当前时刻所经历的CPU时钟周期数。
if(clock()-dwLast>100)
{ ++flag;
flag=flag%4;
}
if(flag==0)
{glutSolidSphere(50,150,150);}//flag=0,绘制球体
else if(flag==1)
{glutSolidCube(50.0);}//flag=1,绘制正方体
else if(flag==2)
{glutSolidCone(25,100,20,24);}//flag=2,绘制圆锥
else if(flag==3)
{glutSolidTorus(10,40,24,24);}//flag=3,绘制圆环
glDisable( GL_LIGHTING );
glDisable( GL_DEPTH_TEST );
dwLast=clock();
}
运行结果如图3所示。
图3 切换4个模型
【补充】如果想切换多个模型,可以通过改变flag的值来实现。