赞
踩
额外知识点:
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);
在画刻度时,每个刻度的角度间隔都一致,我们就可以使用一个循环来解决,而不需要手动重复多组代码操作,显得多余。
- int x,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)
- else if (i %5 == 0)
- circle(x,y,3);
- else
- putpixel(x,y,WHITE);
- }
-
- outtextxy(center_x - 25,center_y + Width/6,"我的时钟");
- //运用outtextxy输出文字
效果图:!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
然后东拼西凑,就完成了,没错,教你拧螺丝,给我造飞机。
代码总结如下(使用软件VS2022)
- #include<graphics.h>
- #include<conio.h>
- #include<math.h>
-
- #define High 480
- #define Width 640
- #define PI 3.14159
-
- int main()
- {
- initgraph(Width, High);
- int center_x, center_y;
- center_x = Width / 2;
- center_y = High / 2;
- 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;
- float secondAngle;
- float minuteAngle;
- float hourAngle;
-
- SYSTEMTIME ti;
-
- BeginBatchDraw();
- while (1)
- {
- setlinestyle(PS_SOLID, 1);
- setcolor(WHITE);
- circle(center_x, center_y, Width / 4);
-
- int x, 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);
- else if (i % 5 == 0)
- circle(x, y, 3);
- else
- putpixel(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();
- return 0;
- }
目前第一次手敲不用修改的代码,感动自己一秒。
还有更多好玩的实例,我们下次再见,拜拜!
资料参考:C语言课程设计与游戏开发实践教程
简单绘图游戏开发
4.3——————实时时钟
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。