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

简介: 在前面的学习中,我们尝试了反弹小球,飞机大战,跳跃小鸟,贪吃蛇等游戏的开发复现在对经典的怀念时,我们也得往前看。在娱乐过后,必定是对生活的运用与实践和便利,而现在,便要涉及到这节内容——实时时钟,给自己的电脑开一个可随时查看的钟表你是否知道其中的原理?现在让我们一起来探讨一下吧!

额外知识点:

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


目录

前言

设计思路

绘制画布

头函数

宏定义

 

绘制时钟

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

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

 

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

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

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


前言

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

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

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

图片作者:月色朦胧image.gif编辑

设计思路

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

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

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

    绘制画布

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

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

    int main()
    {
        initgraph(Width,High);
    }

    image.gif

    头函数

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

    image.gif

    宏定义

    #define High 480
    #define Width 640
    #define PI 3.14159

    image.gif

    image.gif编辑

    绘制时钟

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

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

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

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

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

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

    image.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;                   //时针对应角度

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

    //由角度决定的秒针终点坐标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秒

    image.gif

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

    此时就会涉及到我们文章开头定义的系统变量(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);

    image.gif

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

    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输出文字

    image.gif

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

    image.gif编辑

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

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

    #include<graphics.h>#include<conio.h>#include<math.h>#define High 480#define Width 640#define PI 3.14159intmain()
    {
    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;
    }

    image.gif


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

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


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

                   简单绘图游戏开发

                   4.3——————实时时钟

    相关文章
    |
    定位技术 C语言 C++
    C语言书写推箱子(坤坤版easyx库)
    C语言书写推箱子(坤坤版easyx库)
    |
    机器学习/深度学习 C语言 C++
    【c语言】五子棋(EasyX图形库+背景音乐)
    【c语言】五子棋(EasyX图形库+背景音乐)
    201 0
    |
    C语言
    c语言通过easyx窗口实现小球打砖块的游戏
    c语言通过easyx窗口实现小球打砖块的游戏
    198 0
    |
    小程序 API C语言
    【精选】新年祝福(C语言),Easyx图形库应用+源代码分享
    展示一篇当时学习easyx时候写的一个小程序
    211 0
    【精选】新年祝福(C语言),Easyx图形库应用+源代码分享
    |
    API C语言 开发者
    |
    IDE 开发工具 C语言
    学习C语言十天了,我实现了仿真自由落体小球『C/C++&图形库EasyX』
    学习C语言十天了,我实现了仿真自由落体小球『C/C++&图形库EasyX』
    286 0
    |
    2月前
    |
    C语言 C++
    C语言 之 内存函数
    C语言 之 内存函数
    37 3
    |
    9天前
    |
    存储 缓存 算法
    【C语言】内存管理函数详细讲解
    在C语言编程中,内存管理是至关重要的。动态内存分配函数允许程序在运行时请求和释放内存,这对于处理不确定大小的数据结构至关重要。以下是C语言内存管理函数的详细讲解,包括每个函数的功能、标准格式、示例代码、代码解释及其输出。
    35 6
    |
    26天前
    |
    C语言
    c语言调用的函数的声明
    被调用的函数的声明: 一个函数调用另一个函数需具备的条件: 首先被调用的函数必须是已经存在的函数,即头文件中存在或已经定义过; 如果使用库函数,一般应该在本文件开头用#include命令将调用有关库函数时在所需要用到的信息“包含”到本文件中。.h文件是头文件所用的后缀。 如果使用用户自己定义的函数,而且该函数与使用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数做声明。 如果被调用的函数定义出现在主调函数之前可以不必声明。 如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必多所调用的函数在做声明
    31 6