当前位置:   article > 正文

【C语言】运用easyX——实现实时时钟,给自己的桌面加点料_easyx定时器

easyx定时器

额外知识点:

SYSTEMTIME ti / GetLocalTime(&ti),获取系统时间同步代码,C语言实现时、分、秒针转动


目录

 

前言

 设计思路

绘制画布

头函数

宏定义

 

绘制时钟

确立中心原点——动而不变一点

确定三线绕心而动——圆周周而复始

 

绘制三线时分秒,实现转动

实时转动——初步成型的桌面钟表

绘制表盘刻度—— 完成钟表制作


 

前言

在前面的学习中,我们尝试了反弹小球,飞机大战,跳跃小鸟,贪吃蛇等游戏的开发复现

在对经典的怀念时,我们也得往前看。在娱乐过后,必定是对生活的运用与实践和便利,而现在,便要涉及到这节内容——实时时钟,给自己的电脑开一个可随时查看的钟表

你是否知道其中的原理?现在让我们一起来探讨一下吧。

37e2ca514805464f9a0000cb48937ed7.jpeg

图片作者:月色朦胧

 设计思路

  • 绘制画布大小
  • 钟表实际为三根线固定一点,做圆周运动
  • 确定中心
  • 绘制时、分、秒针
  • 实现转动
  • 获取并同步系统时间
  • 添加刻度

关于easyX的使用,还未了解的朋友可以去此处进行相关内容的补充

easyX配套VC++(easyx安装及vc/vs安装)一招让你的代码黑框更多彩

 

绘制画布

定义长宽,确立绘图窗口,这个是必不可少的,当然在此之前,还需要有头函数和宏定义,已经列在下边,可自行参考

主函数中初始化绘图窗口即可

  1. int main()
  2. {
  3. initgraph(Width,High);
  4. }

头函数

  1. #include<graphics.h> //引用EasyX图形库
  2. #include<conio.h>
  3. #include<math.h> //顾名思义,肯定和数学有关

宏定义

  1. #define High 480
  2. #define Width 640
  3. #define PI 3.14159

20c71fce1ef941518bfa7064b5aae5b2.jpeg

 

绘制时钟

确立中心原点——动而不变一点

我们定义中心坐标,只要找到我们所需的中心坐标X和Y即可,而这,实际上就是钟表的中心,在定义好的画布里,我们只需将其长宽分别除2。

定义的坐标,用int,名称就根据含义命名center_x,center_y

再通过计算求坐标center_x = Width/2        center_y = High/2

确定三线绕心而动——圆周周而复始

首先,在我们日常表述时,简单易懂,不就是直线固定一端点为圆心就转圈嘛,可是在计算机中,还需表达更准确,才能使其执行你的命令,例如深究直线,转动的前提得有线,而两点则确定一条直线。此时线有了,还需要进行线的变动,根据时间变化(例:秒针一圈60秒,一圈则是一个圆周2*PI)这远远不够,由于是绘制图像,所以变更后,我们就需要将上一秒的变化隐藏,否则一圈下来,屏幕就花了

c55839b5bcc34d04937ae895bd5591b8.gif

 

绘制三线时分秒,实现转动

依然是定义,使用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;                   //时针对应角度

以秒针为例,参考绘线代码

  1. //由角度决定的秒针终点坐标
  2. secondEnd_x = center_x + secondLength * sin(secondAngle);
  3. secondEnd_y = center_y + secondLength * cos(secondAngle);
  4. setlinestyle(PS_SOLID,2); //画宽度为两个像素的实线
  5. setcolor(GREEN); //画绿色秒针
  6. line(center_x,center_y,secondEnd_x,secondEnd_y);
  7. sleep(100); //延时100毫秒,即一秒
  8. setcolor(BALCK); //用黑色线条隐藏前一帧的秒针
  9. line(center_x,center_y,secondEnd_x,secondEnd_y);
  10. //秒针变化角度
  11. secondAngle = secondAngle * 2 * PI/60;
  12. //一圈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

  1. setlinestyle(PS_SOLID,1);
  2. setcolor(WHITE);
  3. circle(center_x,center_y,Width/4);

 在画刻度时,每个刻度的角度间隔都一致,我们就可以使用一个循环来解决,而不需要手动重复多组代码操作,显得多余。

  1. int x,y,i;
  2. for(i=0;i<60;i++)
  3. {
  4. x = center_x + int(Width/4.3 * sin(PI * 2 * i/60));
  5. y = center_y + int(Width/4.3 * cos(PI * 2 * i/60));
  6. if(i % 15 == 0)
  7. bar(x - 5, y - 5, x + 5, y + 5)
  8. else if (i %5 == 0)
  9. circle(x,y,3);
  10. else
  11. putpixel(x,y,WHITE);
  12. }
  13. outtextxy(center_x - 25,center_y + Width/6,"我的时钟");
  14. //运用outtextxy输出文字

效果图:!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 

55c14214f8c54423a513f1d17c18f148.gif

 

然后东拼西凑,就完成了,没错,教你拧螺丝,给我造飞机。 

 代码总结如下(使用软件VS2022)

  1. #include<graphics.h>
  2. #include<conio.h>
  3. #include<math.h>
  4. #define High 480
  5. #define Width 640
  6. #define PI 3.14159
  7. int main()
  8. {
  9. initgraph(Width, High);
  10. int center_x, center_y;
  11. center_x = Width / 2;
  12. center_y = High / 2;
  13. int secondLength = Width / 7;
  14. int minuteLength = Width / 6;
  15. int hourLength = Width / 5;
  16. int secondEnd_x, secondEnd_y;
  17. int minuteEnd_x, minuteEnd_y;
  18. int hourEnd_x, hourEnd_y;
  19. float secondAngle;
  20. float minuteAngle;
  21. float hourAngle;
  22. SYSTEMTIME ti;
  23. BeginBatchDraw();
  24. while (1)
  25. {
  26. setlinestyle(PS_SOLID, 1);
  27. setcolor(WHITE);
  28. circle(center_x, center_y, Width / 4);
  29. int x, y, i;
  30. for (i = 0; i < 60; i++)
  31. {
  32. x = center_x + int(Width / 4.3 * sin(PI * 2 * i / 60));
  33. y = center_y + int(Width / 4.3 * cos(PI * 2 * i / 60));
  34. if (i % 15 == 0)
  35. bar(x - 5, y - 5, x + 5, y + 5);
  36. else if (i % 5 == 0)
  37. circle(x, y, 3);
  38. else
  39. putpixel(x, y, WHITE);
  40. }
  41. outtextxy(center_x - 25, center_y + Width / 6, "北京时间");
  42. GetLocalTime(&ti);
  43. secondAngle = ti.wSecond * 2 * PI / 60;
  44. minuteAngle = ti. wMinute * 2 * PI / 60 + secondAngle / 60;
  45. hourAngle = ti.wHour * 2 * PI / 12 + minuteAngle / 12;
  46. secondEnd_x = center_x + secondLength * sin(secondAngle);
  47. secondEnd_y = center_y - secondLength * cos(secondAngle);
  48. minuteEnd_x = center_x + minuteLength * sin(minuteAngle);
  49. minuteEnd_y = center_y - minuteLength * cos(minuteAngle);
  50. hourEnd_x = center_x + hourLength * sin(hourAngle);
  51. hourEnd_y = center_y - hourLength * cos(hourAngle);
  52. setlinestyle(PS_SOLID, 2);
  53. setcolor(YELLOW);
  54. line(center_x, center_y, secondEnd_x, secondEnd_y);
  55. setlinestyle(PS_SOLID, 4);
  56. setcolor(BLUE);
  57. line(center_x, center_y, minuteEnd_x, minuteEnd_y);
  58. setlinestyle(PS_SOLID, 6);
  59. setcolor(RED);
  60. line(center_x, center_y, hourEnd_x, hourEnd_y);
  61. FlushBatchDraw();
  62. Sleep(10);
  63. setcolor(BLACK);
  64. setlinestyle(PS_SOLID, 2);
  65. line(center_x, center_y, secondEnd_x, secondEnd_y);
  66. setlinestyle(PS_SOLID, 5);
  67. line(center_x, center_y, minuteEnd_x, minuteEnd_y);
  68. setlinestyle(PS_SOLID, 10);
  69. line(center_x, center_y, hourEnd_x, hourEnd_y);
  70. }
  71. EndBatchDraw();
  72. _getch();
  73. closegraph();
  74. return 0;
  75. }

 


目前第一次手敲不用修改的代码,感动自己一秒。

还有更多好玩的实例,我们下次再见,拜拜!


资料参考:C语言课程设计与游戏开发实践教程

                简单绘图游戏开发

                4.3——————实时时钟

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/94154
推荐阅读
相关标签
  

闽ICP备14008679号