EGE基础:时间函数篇

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专栏

  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 18
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

依稀_yixy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值