用cpp画出哆啦A梦

        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函数来进行操作延迟。最终效果就是这样。

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值