c语言的初步学习临近尾声,但内心总有些空虚。学习过程中一直是围绕着终端、键盘、显示屏、文件来实现功能,总觉得少了点可视可见的成果。一方面是拓展学习更多的内容,另一方面是为了满足我用c语言制作游戏的兴趣。机缘巧合之下,在某站看到了有大佬的讲解视频,便进行了一些学习。
首先大佬讲解了制作游戏及绘画的基本条件:vs和easyx。前者不用过多介绍,很多人都很熟悉,后者是一个简单易用的图形化库,里边包含了很多绘制图形的函数以及展示用的画板。因为这个图形库只能与vs搭配所以使用环境上会比较局限。
感兴趣的小伙伴可以在下述链接中获取vs2022和easyx图形库。Visual Studio 2022 IDE - 适用于软件开发人员的编程工具 (microsoft.com)
EasyX Graphics Library for C++
vs如何安装网上有很多教程,我就不啰嗦了。easyx安装后会自动识别当前vs的版本,点击对应的安装按钮即可。准备工作结束后就是实际上手写代码了。首先创建cpp的源文件,因为easyx图形库只支持cpp,不支持c。其次在头文件部分引入<easyx.h>,这样才能调用相应的函数。先把框架搭起来。
#include<stdio.h>
#include<easyx.h>
int main()
{
return 0;
}
首先我们认识几个<easyx.h>包含的函数:
//此函数的功能类似于创建一块画布。第一个参数为画布长,第二个为画布宽
initgraph(1024, 1024);
//此函数的功能为将画布的背景色改为指定颜色,这里我选择的是白色。括号内是大写的颜色英文
setbkcolor(WHITE);
//此函数的功能为用当前背景色清除画布上的内容,因为画布在创建时已经初始化为黑色,
//此时想改成白色就需要初始化后修改才会生效
cleardevice();
//此函数的功能为设定绘画用线条的颜色,同样用颜色的大写英文来修改
setlinecolor(BLACK);
//此函数用于修改线条的类型和粗细。前者是线条类型这里选择连续实线,后者是粗细以像素为单位。
setlinestyle(PS_SOLID, 10);
//此函数用于关闭画布。
closegraph();
以上函数是绘画的基础,接下来在介绍几个图形函数:
//此函数的功能是设置填充色
setfillcolor(BLUE);
//此函数的功能是画一个椭圆,参数分别为矩形的左上顶点和右下顶点。
fillellipse(50, 50, 990, 931);
//此函数的功能是画圆,参数依次为圆心的x轴坐标、y轴坐标、半径
solidcircle(400, 330,25);
//此函数的功能是画一个带描边填充的圆
fillcircle(469, 375, 35);
//此函数的功能是画一条直线,前两个参数为起点坐标,后两个为终点坐标。
line(469, 410, 469, 670);
//此函数的功能是画一个弧线,前两个参数为矩形的左上角坐标,中间两个为矩形的左下角坐标
//后两个为弧线的起始角和终止角。
arc(240, 510, 789, 827, PI, 2 * PI);
认识了需要使用的所有函数后,接下来要讲讲大部分函数都会用到的一个参数:坐标点。
我们创建的画布会有一个物理原点,就是最左上角的那个点。以这个点从左向右射出的线就是x轴,从这个点由上到下射出的线就是y轴。有了x轴和y轴那我们就可以确定点坐标了。在画布内只要不更改逻辑原点,那么x和y的坐标都是正数。
再讲讲画椭圆为什么需要矩形的顶点坐标,因为该函数是采取矩形内切的方式画圆,所以只要确定了矩形的左上顶点和左下顶点就可以确定矩形,也就可以确定椭圆的形状了。
我们首先创建一块1024*1024大小的画布,随后设置画布的背景色、线条的颜色、粗细。接下来就是具体的绘画了。我们从大到小开始绘画,首先用椭圆函数画出哆啦A梦脑袋最外围蓝色的一圈。
setfillcolor(BLUE);//设置填充色
fillellipse(50, 50, 990, 931);//ellipse是椭圆,fill是填充图形
随后是脸部白色的部分,基本一致。难点就在于对坐标的把握,需要慢慢调试:
setfillcolor(WHITE);
fillellipse(115, 280, 919, 931);
接下来依次是左眼、右眼及左眼高光、右眼高光的代码:
setfillcolor(WHITE);
fillellipse(270, 150, 470,400);//左眼
setfillcolor(WHITE);
fillellipse(470, 150, 670, 400);//右眼
setfillcolor(BLACK);
solidcircle(400, 330,25);//左眼瞳孔,是圆
setfillcolor(BLACK);
solidcircle(530, 330, 25);//右眼瞳孔
setfillcolor(WHITE);
solidcircle(400, 330, 10);//左眼高光,是圆
setfillcolor(WHITE);
solidcircle(530, 330, 10);//右眼高光
下来是红鼻子、一根竖线、嘴和胡子:
setfillcolor(RED);
fillcircle(469, 375, 35);//鼻子,填充色为红色,依旧是圆
line(469, 410, 469, 670);//竖线,用两个点确定
//画圆弧的方法与画椭圆一样,都是在矩形内做内切。但是要确定角度问题
//所以需要引入pi来表达起始角和终止角,这里我们要画180度的弧线,所以是pi和2*pi
arc(240, 510, 789, 827, PI, 2 * PI);
//胡子就是六条线段,在左右两边各找到相近的6个点,两两相连就可以了。
line(125, 313, 296, 410);
line(83, 444, 270, 474);
line(83, 595, 262, 527);
line(819, 414, 990, 320);
line(845, 478, 1029, 448);
line(853, 542, 1029, 660);
完整代码如下:
#include<stdio.h>
#include<easyx.h>
#include<Windows.h>
#define PI 3.14
int main()
{
initgraph(1024, 1024);
setbkcolor(WHITE);
cleardevice();
setlinecolor(BLACK);
setlinestyle(PS_SOLID, 10);
//脸蓝色部分
setfillcolor(BLUE);
fillellipse(50, 50, 990, 931);//ellipse是椭圆
Sleep(1000);
//脸白色部分
setfillcolor(WHITE);
fillellipse(115, 280, 919, 931);//ellipse
Sleep(1000);
//左眼轮廓
setfillcolor(WHITE);
fillellipse(270, 150, 470,400);//ellipse
Sleep(1000);
//右眼轮廓
setfillcolor(WHITE);
fillellipse(470, 150, 670, 400);//ellipse
Sleep(1000);
//左眼瞳孔
setfillcolor(BLACK);
solidcircle(400, 330,25);//圆
Sleep(1000);
//右眼瞳孔
setfillcolor(BLACK);
solidcircle(530, 330, 25);//圆
Sleep(1000);
//左眼高光
setfillcolor(WHITE);
solidcircle(400, 330, 10);//圆
Sleep(1000);
//右眼高光
setfillcolor(WHITE);
solidcircle(530, 330, 10);//圆
Sleep(1000);
//鼻子
setfillcolor(RED);
fillcircle(469, 375, 35);//圆
Sleep(1000);
//竖线
line(469, 410, 469, 670);
Sleep(1000);
// 嘴巴
arc(240, 510, 789, 827, PI, 2 * PI);
Sleep(1000);
//胡子
line(125, 313, 296, 410);
line(83, 444, 270, 474);
line(83, 595, 262, 527);
line(819, 414, 990, 320);
line(845, 478, 1029, 448);
line(853, 542, 1029, 660);
getchar();
closegraph;
return 0;
}
因为需要在画布上展示绘画过程,所以增加了sleep函数来进行操作延迟。最终效果就是这样。