额外知识点:
SYSTEMTIME ti / GetLocalTime(&ti),获取系统时间同步代码,C语言实现时、分、秒针转动
目录
前言
在前面的学习中,我们尝试了反弹小球,飞机大战,跳跃小鸟,贪吃蛇等游戏的开发复现
在对经典的怀念时,我们也得往前看。在娱乐过后,必定是对生活的运用与实践和便利,而现在,便要涉及到这节内容——实时时钟,给自己的电脑开一个可随时查看的钟表
你是否知道其中的原理?现在让我们一起来探讨一下吧。
图片作者:月色朦胧编辑
设计思路
- 绘制画布大小
- 钟表实际为三根线固定一点,做圆周运动
- 确定中心
- 绘制时、分、秒针
- 实现转动
- 获取并同步系统时间
- 添加刻度
关于easyX的使用,还未了解的朋友可以去此处进行相关内容的补充
easyX配套VC++(easyx安装及vc/vs安装)一招让你的代码黑框更多彩
绘制画布
定义长宽,确立绘图窗口,这个是必不可少的,当然在此之前,还需要有头函数和宏定义,已经列在下边,可自行参考
主函数中初始化绘图窗口即可
int main() { initgraph(Width,High); }
头函数
#include<graphics.h> //引用EasyX图形库 #include<conio.h> #include<math.h> //顾名思义,肯定和数学有关
宏定义
#define High 480 #define Width 640 #define PI 3.14159
编辑
绘制时钟
确立中心原点——动而不变一点
我们定义中心坐标,只要找到我们所需的中心坐标X和Y即可,而这,实际上就是钟表的中心,在定义好的画布里,我们只需将其长宽分别除2。
定义的坐标,用int,名称就根据含义命名center_x,center_y
再通过计算求坐标center_x = Width/2 center_y = High/2
确定三线绕心而动——圆周周而复始
首先,在我们日常表述时,简单易懂,不就是直线固定一端点为圆心就转圈嘛,可是在计算机中,还需表达更准确,才能使其执行你的命令,例如深究直线,转动的前提得有线,而两点则确定一条直线。此时线有了,还需要进行线的变动,根据时间变化(例:秒针一圈60秒,一圈则是一个圆周2*PI)这远远不够,由于是绘制图像,所以变更后,我们就需要将上一秒的变化隐藏,否则一圈下来,屏幕就花了
编辑
绘制三线时分秒,实现转动
依然是定义,使用int,定义起点都一样了,根据常识,我们需要区分它们的长度 秒>分>时
int secondLength = Width/7; //秒针长度
int minuteLength = Width/6; //分针长度
int hourLength = Width/5; //时针长度
int secondEnd_x,secondEnd_y; //秒针终点
int minuteEnd_x,minuteEnd_y; //分针终点
int hourEnd_x,hourEnd_y; //时针终点
同时定义出各自的变化角度(圆周是360°,此处就根据每秒的变化,改变线条角度)由于是涉及多位数除法,确保精度,此处使用float
float secondAngle; //秒针对应角度
float mibuteAngle; //分针对应角度
float hourAngle; //时针对应角度
以秒针为例,参考绘线代码
//由角度决定的秒针终点坐标secondEnd_x=center_x+secondLength*sin(secondAngle); secondEnd_y=center_y+secondLength*cos(secondAngle); setlinestyle(PS_SOLID,2); //画宽度为两个像素的实线setcolor(GREEN); //画绿色秒针line(center_x,center_y,secondEnd_x,secondEnd_y); sleep(100); //延时100毫秒,即一秒setcolor(BALCK); //用黑色线条隐藏前一帧的秒针line(center_x,center_y,secondEnd_x,secondEnd_y); //秒针变化角度secondAngle=secondAngle*2*PI/60; //一圈2*PI,60秒
实时转动——初步成型的桌面钟表
此时就会涉及到我们文章开头定义的系统变量(SYSTEMTIME ti),接着再通过GetLocalTime(&ti)获取当前时间,
秒针的角度就改为由实际时间确定,即secondAngle = ti.wSecond * 2* PI/60;
分针的角度同理 minuteAngle = ti.wMinute * 2 * PI/60;
时针的角度同理 hourAngle = ti.wHour * 2 PI/12;
绘制表盘刻度—— 完成钟表制作
绘制表盘,实则绘制一个圆,即使用easyX代码格式circle
setlinestyle(PS_SOLID,1); setcolor(WHITE); circle(center_x,center_y,Width/4);
在画刻度时,每个刻度的角度间隔都一致,我们就可以使用一个循环来解决,而不需要手动重复多组代码操作,显得多余。
intx,y,i; for(i=0;i<60;i++) { x=center_x+int(Width/4.3*sin(PI*2*i/60)); y=center_y+int(Width/4.3*cos(PI*2*i/60)); if(i%15==0) bar(x-5, y-5, x+5, y+5) elseif (i%5==0) circle(x,y,3); elseputpixel(x,y,WHITE); } outtextxy(center_x-25,center_y+Width/6,"我的时钟");//运用outtextxy输出文字
效果图:!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
编辑
然后东拼西凑,就完成了,没错,教你拧螺丝,给我造飞机。
代码总结如下(使用软件VS2022)
intmain() { initgraph(Width, High); intcenter_x, center_y; center_x=Width/2; center_y=High/2; intsecondLength=Width/7; intminuteLength=Width/6; inthourLength=Width/5; intsecondEnd_x, secondEnd_y; intminuteEnd_x, minuteEnd_y; inthourEnd_x, hourEnd_y; floatsecondAngle; floatminuteAngle; floathourAngle; SYSTEMTIMEti; BeginBatchDraw(); while (1) { setlinestyle(PS_SOLID, 1); setcolor(WHITE); circle(center_x, center_y, Width/4); intx, y, i; for (i=0; i<60; i++) { x=center_x+int(Width/4.3*sin(PI*2*i/60)); y=center_y+int(Width/4.3*cos(PI*2*i/60)); if (i%15==0) bar(x-5, y-5, x+5, y+5); elseif (i%5==0) circle(x, y, 3); elseputpixel(x, y, WHITE); } outtextxy(center_x-25, center_y+Width/6, "北京时间"); GetLocalTime(&ti); secondAngle=ti.wSecond*2*PI/60; minuteAngle=ti. wMinute*2*PI/60+secondAngle/60; hourAngle=ti.wHour*2*PI/12+minuteAngle/12; secondEnd_x=center_x+secondLength*sin(secondAngle); secondEnd_y=center_y-secondLength*cos(secondAngle); minuteEnd_x=center_x+minuteLength*sin(minuteAngle); minuteEnd_y=center_y-minuteLength*cos(minuteAngle); hourEnd_x=center_x+hourLength*sin(hourAngle); hourEnd_y=center_y-hourLength*cos(hourAngle); setlinestyle(PS_SOLID, 2); setcolor(YELLOW); line(center_x, center_y, secondEnd_x, secondEnd_y); setlinestyle(PS_SOLID, 4); setcolor(BLUE); line(center_x, center_y, minuteEnd_x, minuteEnd_y); setlinestyle(PS_SOLID, 6); setcolor(RED); line(center_x, center_y, hourEnd_x, hourEnd_y); FlushBatchDraw(); Sleep(10); setcolor(BLACK); setlinestyle(PS_SOLID, 2); line(center_x, center_y, secondEnd_x, secondEnd_y); setlinestyle(PS_SOLID, 5); line(center_x, center_y, minuteEnd_x, minuteEnd_y); setlinestyle(PS_SOLID, 10); line(center_x, center_y, hourEnd_x, hourEnd_y); } EndBatchDraw(); _getch(); closegraph(); return0; }
目前第一次手敲不用修改的代码,感动自己一秒。
还有更多好玩的实例,我们下次再见,拜拜!
资料参考:C语言课程设计与游戏开发实践教程
简单绘图游戏开发
4.3——————实时时钟