EGE专栏:EGE专栏
一、时间相关函数
1. 延时函数
延时函数的作用是使后面的代码延迟一段时间再执行,此时程序犹如被按下了暂停键,时间过后才会恢复(延时通常只影响当前线程)。
EGE 中的延时函数主要有三类:
① 纯延时函数
② 延时固定时间,附带刷新窗口内容的作用
③ 按照设定的帧率延时,延时时间自动调整而不固定,附带刷新窗口内容的作用
1.1 delay_ms( ) 函数
平均延迟以毫秒为单位的时间, 附带刷新窗口内容。
delay_ms(time);
1.2 delay( ) 函数
至少延迟以毫秒为单位的时间。只延时,不会刷新窗口内容。
delay(time);
2. 帧率延时
- 附带刷新窗口的作用
- 延迟以 FPS 为准的时间,以实现稳定帧率
delay_fps(fps);
- 延迟以 FPS 为准的时间,以实现稳定帧率(带跳帧)
delay_jfps(fps);
- 使用示例,用来稳定帧率,设定一秒钟循环60次(实际受一个循环的执行时间影响)
for ( ; is_run(); delay_fps(60)) {
}
3.
纯延时,不会附带刷新窗口的作用
api_sleep() 可以用于延时,内部实际上调用的是 Windows API中的 Sleep() 函数。
VOID api_sleep(long dwMilliseconds);
- dwMilliseconds 要延迟的时间,以毫秒为单位
4. 程序运行时间
- 获取当前程序从初始化起经过的时间,以秒为单位, 精度 0.01 秒
double fclock();
通过不断地获取当前时间,可以用来计时和倒计时。
计时
程序创建个开始时间变量,在帧循环中不断获取当前时间,然后得到时间差,便可以计算时间。如果想要重新计时,把开始时间设为当前时间即可重新开始
示例程序:
#include <graphics.h>
int main()
{
initgraph(480, 320);
setrendermode(RENDER_MANUAL);
setbkcolor(WHITE);
setcolor(BLACK);
setfont(20, 0, "楷体");
setbkmode(TRANSPARENT);
//设置开始时间
double startTime = fclock();
for (; is_run(); delay_fps(60)) {
cleardevice();
//在帧循环中不断获取运行时间
double runTime = fclock();
//当前时间就等于两个时间差
double curTime = runTime - startTime;
//输出时间,小数时间显示
outtextxy(20, 20, "小数时间显示:");
xyprintf(20, 40, "运行总时间:%.3lf", runTime);
xyprintf(20, 60, "计时:%.3lf", curTime);
//输出时间,整数时间显示
outtextxy(20, 120, "整数时间显示:");
xyprintf(20, 140, "运行总时间:%d", (int)runTime);
xyprintf(20, 160, "计时:%d", (int)curTime);
//按下任意键重新计时
if (kbmsg()) {
//清空按键消息
flushkey();
//把开始时间设置为当前时间即可
startTime = runTime;
}
}
getch();
closegraph();
return 0;
}
倒计时
倒计时和计时类似,只不过设立结束时间 endTime。不断地将当前时间与结束时间比较,结束时间和当前时间的差就等于剩余时间。
- 时间到的标志为 当前时间 >= 结束时间
- 剩余时间 = 结束时间 - 当前时间, 如果剩余时间小于0则置为0
- 倒计时的整数要向上取整, 即转成的整数不能比当前值小, 使用头文件 math.h 中的 ceil() 函数
- 时间重置:将 结束时间 = 当前时间 + 要倒计时的时间 即可
倒计时示例:
#include <graphics.h>
#include <math.h>
int main()
{
initgraph(480, 320);
setrendermode(RENDER_MANUAL);
setbkcolor(WHITE);
setcolor(BLACK);
setfont(20, 0, "楷体");
setbkmode(TRANSPARENT);
//设置结束时间, 这里设10秒倒计时
double endTime = fclock() + 10;
for (; is_run(); delay_fps(60)) {
cleardevice();
//在帧循环中不断获取运行时间
double runTime = fclock();
//当前时间就等于两个时间差
double remainTime = endTime - runTime;
if (remainTime < 0)
remainTime = 0;
//输出时间,小数时间显示
outtextxy(20, 20, "小数时间显示:");
xyprintf(20, 40, "运行总时间:%.3lf", runTime);
xyprintf(20, 60, "倒计时:%.3lf", remainTime);
//输出时间,整数时间显示
outtextxy(20, 120, "整数时间显示:");
xyprintf(20, 140, "运行总时间:%d", (int)runTime);
xyprintf(20, 160, "倒计时:%d", (int)ceil(remainTime));
//剩余时间为0, 或者 runTime >= endTime
if (remainTime == 0)
outtextxy(20, 220, "时间到了");
//按下任意键重新倒计时
if (kbmsg()) {
//清空按键消息
flushkey();
//把结束时间设置为当前时间加上要倒计时的时间, 这里设10秒
endTime = runTime + 10;
}
}
getch();
closegraph();
return 0;
}
EGE专栏:EGE专栏