本次我给您带来easyX库系列的博文,本系列博文目的在于对原easyX库文档进行一个补充和注解,重在补充测试样例和实践。
easyX库本身并不值得过于学习,但是作为有C语言基础的C爱好者,学习easyX能让您对IT技术更加感兴趣。用easyX库的时候,除了编程,还能学到跟多知识,例如:“色彩模型”、“掩码”等。
使用easyX库能让我们体验到一点点开发的乐趣所在,本系列承诺将在学习末尾给出几个经典小游戏的code供您参考。
这一部分我直接摆出原文,其中有些陌生概念我会一一进行注解(注意,现在写这篇博文的时间点是2023/6/16)
“基本说明:EasyX 是针对 C++ 的图形库,可以帮助 C/C++ 初学者快速上手图形和游戏编程。
比如,可以基于 EasyX 图形库很快的用几何图形画一个房子,或者一辆移动的小车,可以编写俄罗斯方块、贪吃蛇、黑白棋等小游戏,可以练习图形学的各种算法,等等。
许多人学编程都是从 C 语言入门的,而现状是:
- 有些学校以 Turbo C 为环境学习 C 语言,只是 Turbo C 实在太老了,复制粘贴都很不方便。
- 有些学校直接拿 VC 来讲 C 语言,因为 VC 的编辑和调试环境都很优秀,并且 VC 有适合教学的免费版本。可惜在 VC 里面只能做一些文字性的练习题,想画条直线或一个圆都很难,例如需要注册窗口类、建消息循环等等,初学者会受严重打击的。初学编程想要绘图就得用 TC,很是无奈。
- 还有计算机图形学,这门课程的重点是绘图算法,而不是 Windows 编程。所以,许多老师不得不用 TC 教学,因为 Windows 绘图太复杂了,会偏离教学的重点。新的图形学的书有不少是用的 OpenGL,可是门槛依然很高。
所以,我们想给大家一个更好的学习平台,就是 VC 方便的开发平台和 TC 简单的绘图功能,于是就有了这个 EasyX 库。如果您刚开始学 C 语言,或者您是一位教 C 语言的老师,再或者您在教计算机图形学,那么这个库一定会让您兴奋的。”——来自easyX库官方文档
官方文档有写,有时间我还会给出一个动态的.gif图来演示安装过程。
“比如:启动 Visual C++,创建一个空的控制台项目(Win32 Console Application),然后添加一个新的代码文件(.cpp),并引用 graphics.h 头文件就可以了。”
如果您和我一样使用的是VS2022这款IDE,那么这段话的意思是:您在新建项目的时候,一定要记得创建尾缀为“.cpp”的C++语言源文件,而不是创建尾缀为“.c”的C语言源文件。而原因在开头便有提到:“EasyX 是针对 C++ 的图形库……”。
想要使用easyX库,只需要像引入头文件一样引入图形库头文件就可以了,下面是官网的几个示范例子,您可以试着拷贝一下,来查看自己的easyX库是否安装正确,并且提前预览一下未来使用easyX库后的大致效果。(有的地方我略作了修改,并不影响真正的代码逻辑)
#include // 引用图形库头文件
#include
int main()
{
initgraph(640, 480); // 创建绘图窗口,大小为 640x480 像素
circle(200, 200, 100); // 画圆,圆心(200, 200),半径 100
getchar(); // 按任意键继续
closegraph(); // 关闭绘图窗口
return 0;
}
#include
#include
#include
int main()
{
// 设置随机种子
srand((unsigned) time(NULL));
// 初始化图形模式
initgraph(640, 480);
int x, y;
char c;
settextstyle(16, 8, _T("Courier")); // 设置字体
// 设置颜色
settextcolor(GREEN);
setlinecolor(BLACK);
for (int i = 0; i <= 479; i++)
{
// 在随机位置显示三个随机字母
for (int j = 0; j < 3; j++)
{
x = (rand() % 80) * 8;
y = (rand() % 20) * 24;
c = (rand() % 26) + 65;
outtextxy(x, y, c);
}
// 画线擦掉一个像素行
line(0, i, 639, i);
Sleep(10); // 延时
if (i >= 479) i = -1;
if (_kbhit()) break; // 按任意键退出
}
// 关闭图形模式
closegraph();
return 0;
}
#include
#include
#include
#define MAXSTAR 200 // 星星总数
struct STAR
{
double x;
int y;
double step;
int color;
};
STAR star[MAXSTAR];
// 初始化星星
void InitStar(int i)
{
star[i].x = 0;
star[i].y = rand() % 480;
star[i].step = (rand() % 5000) / 1000.0 + 1;
star[i].color = (int)(star[i].step * 255 / 6.0 + 0.5); // 速度越快,颜色越亮
star[i].color = RGB(star[i].color, star[i].color, star[i].color);
}
// 移动星星
void MoveStar(int i)
{
// 擦掉原来的星星
putpixel((int)star[i].x, star[i].y, 0);
// 计算新位置
star[i].x += star[i].step;
if (star[i].x > 640) InitStar(i);
// 画新星星
putpixel((int)star[i].x, star[i].y, star[i].color);
}
// 主函数
int main()
{
srand((unsigned)time(NULL)); // 随机种子
initgraph(640, 480); // 创建绘图窗口
// 初始化所有星星
for(int i = 0; i < MAXSTAR; i++)
{
InitStar(i);
star[i].x = rand() % 640;
}
// 绘制星空,按任意键退出
while(!_kbhit())
{
for(int i = 0; i < MAXSTAR; i++)
MoveStar(i);
Sleep(20);
}
closegraph(); // 关闭绘图窗口
return 0;
}
在官网甚至还有一个高度模拟windowsXP扫雷的code例子,但是在这里就不copy过来给您看了。
现在,在入门学习easyX库之前,先让我带您理解三个概念:“颜色”、“坐标”、“设备”。
EasyX使用24bit真彩色,不支持调色板模式。
常量 值 颜色
-------- -------- --------
BLACK 0 黑
BLUE 0xAA0000 蓝
GREEN 0x00AA00 绿
CYAN 0xAAAA00 青
RED 0x0000AA 红
MAGENTA 0xAA00AA 紫
BROWN 0x0055AA 棕
LIGHTGRAY 0xAAAAAA 浅灰
DARKGRAY 0x555555 深灰
LIGHTBLUE 0xFF5555 亮蓝
LIGHTGREEN 0x55FF55 亮绿
LIGHTCYAN 0xFFFF55 亮青
LIGHTRED 0x5555FF 亮红
LIGHTMAGENTA 0xFF55FF 亮紫
YELLOW 0x55FFFF 黄
WHITE 0xFFFFFF 白
常见的16进制表示规则为“0xbbggrr”,其中“bb”为蓝、“gg”为绿、“rr”为红。因此一串十六进制字符就可以表示一种颜色。
RGB宏在Windows SDK中定义。Windows SDK全称为Windows Software Development Kit,即“Windows软件开发工具包”,是微软官方提供的一套用于开发Windows操作系统上应用程序的工具集合。包含了许多常用的工具和库,如编译器、调试器、API 文档、示例代码等,提供了完整的开发环境和必要的资源,方便开发者进行开发和测试Windows应用程序。其中最重要的是Windows API(Application Programming Interface)文档,描述了Windows操作系统所提供的各种编程接口,方便开发者在程序中调用系统功能。Windows SDK随着不同版本的Windows操作系统一起发布,因此不同版本的Windows SDK支持的操作系统版本也有所不同。开发者可以根据自己的需求下载和安装对应版本的 Windows SDK,来满足开发需要。此外,Windows SDK中还包含了.NET Framework和Visual Studio相关的工具和库,可用于开发.NET应用程序和Visual Studio扩展等。
COLORREF RGB(
BYTE byRed, // 颜色的红色部分
BYTE byGreen, // 颜色的绿色部分
BYTE byBlue // 颜色的蓝色部分
);
//参数:
//byRed颜色的红色部分,取值范围:0~255。
//byGreen颜色的绿色部分,取值范围:0~255。
//byBlue颜色的蓝色部分,取值范围:0~255。
//返回值:
//返回合成的颜色
可以通过GetRValue、GetGValue、GetBValue宏从RGB颜色中分离出红、绿、蓝颜色分量。
//该函数用于转换HSL颜色为RGB颜色
COLORREF HSLtoRGB(
float H,
float S,
float L
);
//参数:
//H原 HSL 颜色模型的 Hue(色相) 分量,0<=H<360。
//S原 HSL 颜色模型的 Saturation(饱和度) 分量,0<=S<=1。
//L原 HSL 颜色模型的 Lightness(亮度) 分量,0<=L<=1。
//返回值:
//返回对应的RGB颜色
COLORREF HSVtoRGB(
float H,
float S,
float V
);
//参数:
//H 是英文 Hue 的首字母,表示色相,即组成可见光谱的单色。红色在 0 度,绿色在 120 度,蓝色在 240 度,以此方向过渡。
//S 是英文 Saturation 的首字母,表示饱和度,等于 0 时为灰色。在最大饱和度 1 时,每一色相具有最纯的色光。
//V 是英文 Value 的首字母,表示明度,等于 0 时为黑色,在最大明度 1 时,是色彩最鲜明的状态。
//返回值:
//返回对应的RGB颜色
以下是几种设置画线颜色的方法
setlinecolor(0xff0000);
setlinecolor(BLUE);
setlinecolor(RGB(0, 0, 255));
setlinecolor(HSLtoRGB(240, 1, 0.5));
在easyX库中有两种坐标:物理坐标、逻辑坐标。
物理坐标是描述设备(这里的设备是指easyX库中的设备)的坐标体系。坐标原点在设备的左上角,X轴向右为正,Y轴向下为正,度量单位是“像素”。坐标原点、坐标轴方向、缩放比例都不能改变。
逻辑坐标是在程序中用于绘图的坐标体系。坐标默认的原点在窗口的左上角,X 轴向右为正,Y 轴向下为正,度量单位是“点”。默认情况下,逻辑坐标与物理坐标是一一对应的,一个逻辑点等于一个物理像素。在easyX库帮助手册中,凡是没有注明的坐标,均指逻辑坐标。
在easyX库中“设备”是指绘图表面。分两种,一种是默认的绘图窗口,另一种是IMAGE对象。通过SetWorkingImage()可以设置当前用于绘图的设备。设置当前用于绘图的设备后,所有的绘图函数都会绘制在该设备上。