目录
前言
声明:本游戏参考《c语言课程设计与游戏开发实践教程》。
视频效果如下:
钟表
- 时针分针秒针分别是不同颜色、不同宽度、不同长度。
- 时针分针秒针按照电脑系统上的时间转动。
- 缺点就是画面显示有频闪问题,没有刻度。这些也可以当作思考题由你自己来解决哦😋
涉及到的知识
以下知识都会在文中有解析
- Easyx的使用,Sleep函数,SYSTEMTIME型变量的使用(系统时间变量),三角函数sin和cos。
- 利用三角函数计算针转动末尾的坐标和和角度。
Sleep函数
- 属于windows.h函数库。根据不同系统和编译器,有时候也写做cwindow.h。头文件加上#include <windows.h>或者#include<cwindow.h>。
- 作用:在此处让程序运行暂缓***毫秒。
- 使用:Sleep();S是大写,括号内数字默认单位是毫秒。(根据不同系统和编译器,有时候也有可能是小写s)。
sin和cos函数
这两个函数相信大家都不陌生吧,就是我们数学中所用三角函数
- 属于<math.h>函数库。
- 使用:sin(弧度制角度);
Easyx中的函数
SYSTEMTIME
这个可以看作是一个数据类型,用于引用系统时间。使用方法如下(下面展示的是代码段)
SYSTEMTIME ti; //定义一个变量ti
float s,m,h; //分别代表秒,分,时
GetLocalTime(&ti);
s=ti.wSecond; //ti.wSecond是固定写法。
m=ti.wMinute;
h=ti.wHour;
//s,m,h这三个变量都会被赋予系统时间的值
initgraph和closegraph函数
- 这两个函数算是配合使用,前一个创建画面,后一个关闭画面。
- 使用:initgraph(width, high);//括号内分别是画面宽度和高度。closegraph();//直接使用即可
setlinestyle和setcolor
- setlinestyle函数:用于设置画线风格(实线、虚线...)和画线宽度。既可以是圆也可以是直线。使用方法是setlinestyle(画线风格,画线宽度);
- setcolor函数:用于设置画线颜色(RED、WHITE、BLACK、BLUE...也支持自定义RGB调色)。使用很简单,即:setcolor(颜色);
line和circle函数
很显然,一个是用来画直线,一个是用来画圆。下面直接来讲使用方法
- line(起始x坐标,起始y坐标,终点x坐标,终点y坐标;
- circle(圆心x坐标,圆心y坐标,半径);
制作代码
思路是先制作一个会转的秒针,然后再按照同样的方法添加上分针和时针,最后再加上表盘。
废话不多说,直接上代码🐎
#include <graphics.h> //easyx中的函数
#include <math.h> //下面会使用sin和cos函数
//定义画面大小
#define high 480
#define width 640
#define PI 3.14159//圆周率
int main()
{
initgraph(width, high); //按上面宏定义的高和宽展现画面大小,这是easy中的函数,是以像素为单位
//定义表心位置
int x, y;
x = width / 2;
y = high / 2;
//时、分、秒针的长度
int s_long = width / 5;
int m_long = width / 5;
int h_long = width / 8;
//终点
/*
我们是通过在两个坐标点之间画一条直线来显示表针
划线起点是表心,现在定义划线终点
这个划线重点等会是要用三角函数计算的哦
*/
int s_end_x, s_end_y;
int m_end_x, m_end_y;
int h_end_x, h_end_y;
//角度。我们下面计算会用到
float s_angle;
float m_angle;
float h_angle;
//系统变量,用于查看电脑系统上的时间
SYSTEMTIME ti;
//画表盘
int ridus = width / 4; //半径的意思
int o_x, o_y;
o_x = width / 2;
o_y = high / 2;
setlinestyle(PS_SOLID, 1); //easyx函数,规定了画圆用实线,粗细为1像素
circle(o_x, o_y, ridus); //easyx函数,用于画圆,接收数据为表盘中心坐标,半径大小
//因为需要画面一直显示,所以除了定义初始化以外的操作都在死循环中
while (1)
{
GetLocalTime(&ti); //获取当前时间,后面用
//计算三个表针的角度
/*
ti引用的是实际时间,比如3点,15分,26秒
这个计算是把时间转换成弧度制,而且是假设表针初始状态指向最上方
举个例子,假设要转化30秒,经过计算s_angle=PI,即180°,也就是从最上方转到最下方的度数
*/
s_angle = ti.wSecond * 2 * PI / 60;
m_angle = ti.wMinute * 2 * PI / 60;
h_angle = ti.wHour * 2 * PI / 12;
//三个指针终点坐标的变化
s_end_x = x + s_long * sin(s_angle);
s_end_y = y - s_long * cos(s_angle);
m_end_x = x + m_long * sin(m_angle);
m_end_y = y - m_long * cos(m_angle);
h_end_x = x + h_long * sin(h_angle);
h_end_y = y - h_long * cos(h_angle);
/*之所以是-而不是+是因为要让秒针一开始显示在上方。
如果是加的话一开始会显示在下方。
*/
//显示三个表针,显示和隐藏表针操作用的都是easyx函数
setlinestyle(PS_SOLID, 1);
setcolor(WHITE);
line(x, y, s_end_x, s_end_y);
setlinestyle(PS_SOLID, 3);
setcolor(BLUE);
line(x, y, m_end_x, m_end_y);
setlinestyle(PS_SOLID, 6);
setcolor(RED);
line(x, y, h_end_x, h_end_y);
Sleep(10);
//隐藏痕迹。原理是使用黑色的大小相同的表针将原来的位置覆盖
setcolor(BLACK);
line(x, y, s_end_x, s_end_y);
setcolor(BLACK);
line(x, y, m_end_x, m_end_y);
setcolor(BLACK);
line(x, y, h_end_x, h_end_y);
}
closegraph();
return 0;
}
如果有不懂的地方可以随时问我
就酱,拜拜~