今天带大家一起编写一个好玩的程序,你准备好了吗?
话不多说,让我们直接进去主题~
你知道下面这张图片中的角色是谁吗?
猜猜我是谁我相信,只要你参加了2020年第二届国际青少年编程大赛,就一定认识它!
没错,它就是比赛中的主角,人见人爱的超级机器人Dev!
这个造型讨喜的机器人陪伴我们度过了许许多多个欢乐的日子,它不仅带给我们知识,还带给了我们快乐。一定有很多选手对它优美的外形印象深刻,甚至还能将它画下来。
我的一位参赛学生也想将它画下来,但让他苦恼的是,他并不是那么擅长画画。作为他的编程老师,我也希望帮助到他。于是,我们不约而同地产生了一个念头:既然是编程大赛,为什么我们不用Python代码来绘制一个Dev呢?
经过不断的探索和实验,我们最终完成了下图中的作品。而这个作品,仅仅用到了椭圆、长方形和线段三种图形。很神奇吧?如果想知道这是如何完成的,就跟着我们的文章一步一步地探索吧!
用Python代码绘制的Dev形象准备工作
工欲善其事,必先利其器。在开始制作前,我们首先要准备好制作的工具。Python的开源库非常丰富,在图形方面有许多好用的资源,它们各有特色,许多库都可以实现类似的效果。作为一名编程教师,这个作品我门自然而然的选择了我们公司自研的Python图形库:pyleap。
借助pyleap库,我们可以绘制常见图形、图片以及文字,可以检测到鼠标和键盘的时间,还能够实现动画效果和碰撞的检测,很方便地就能完成一些具有交互功能的图形化作品。
在这个作品中,我们要用到的知识点非常少:椭圆的绘制,长方形的绘制,线段的绘制以及图形的旋转。
pyleap中的图形对象图形创作
选定了工具,就进入了创作阶段。在创作Dev时,最困难的地方就是它的身体,眼睛的反光以及身上的橙色装饰线。这些部分都是没有办法直接用简单的单个图形来绘制的。为了解决这些难点,我们探索出了3个秘籍:组合、遮盖和细分。
组合
有些图形,很难直接用一个图形绘制出来,比如Dev的手:
Dev的手上有两种颜色,但一个图形只能有一种颜色。不过这难不倒我们,我们只需要用两个不同颜色的椭圆组合起来就行了。下图演示了这个过程:
用两个椭圆组合成Dev的手组合的方式在绘制过程中使用得非常多。例如,Dev头顶的绘制也使用了类似的方式:
我来组成头部还有哪些地方可以用到这种方式呢?请你也自己探索一下吧!
遮盖
有些部分,不能用简单组合的方式来绘制,我们必须要善用遮盖关系来制作。例如,Dev的眼睛是由简单的椭圆形来组成的,但要做出立体的感觉,还必须得用到遮盖的技巧。
下图演示了如何制作出玻璃上不规则反光的效果:
反光效果是实现玻璃突出效果的关键还有一个不太明显的地方也用到了遮盖的办法:Dev的身体。在Dev身体的遮盖关系中,我们用了描边的方式来画椭圆,巧妙地绘制出了Dev身体的形状。
用椭圆形的描边来进行遮盖将已经制作好的Dev的头顶添加上去,就组成了Dev的主体。
遮盖的位置非常考验技巧只要用于遮盖的图形和背景颜色一致,就不会看到组合的痕迹。
让多余的图形融入黑暗中细分
对于Dev身体上的曲线,我们可以用细分的方式来呈现,这和古代数学家刘徽求圆周率时使用的“割圆术”,就是将曲线化作直线来处理,这其中也蕴含了数学的微分思想。
刘徽的割圆术如图所示,只需要四条线段,就能组成Dev腰上的曲线:
图中用不同颜色标出了不同的线段同样的,Dev头顶的曲线也可以这样完成,这里就不再赘述了。
总之,掌握了这三种方法,加以灵活运用,就能够组成一个可爱的Dev形象了。
代码实现
我们已经确定了用简单图形绘制Dev的可能性,现在就要用代码来实现了。我们要使用的图形在pyleap中分别属于三个类:Ellipse(椭圆),Rectangle(长方形),Line(线段)。
在使用这些图形时,我们还需要对它们进行一些旋转,因此还会用到rotation属性。同时,我们还需要用set_anchor方法来设置一些特殊的旋转中心。
在绘制时,可以用draw方法来填充绘制,也可以用stroke方法绘制描边。
具体的代码知识就不在这里展开了。我会在文章最后列出完整的代码,如果你感兴趣,可以自己去研究pyleap库和我的代码,相信这会为你打开新的世界。
说在最后
最后,我想说一些自己的感想:
都说兴趣是最好的老师,看到我的学生在这次比赛中的表现,我觉得我们的学生缺少的不是好奇心和探究精神,而是优秀的教学内容和愿意和他一起成长的伙伴和老师。
很高兴能看到有这样免费的优秀资源,可以让所有学生都对编程知识感兴趣,让他们体验到编程的魅力。希望有更多的老师和学生加入到比赛中来,也希望有更多的优秀内容被分享给所有学生,少年强则中国强,这是我辈不可推卸的责任。
附:完整代码
在运行前,需要安装Python3和pyleap库。
Python3的安装方法百度即可;
Python3安装完成后,可以在命令行里使用pip install pyleap命令快速安装pyleap库。
frompyleapimport*
window.set_size(400,600)
bg=Rectangle(0,0,400,600,"black")
e1=Ellipse(200,570,112,380,"#afc4f8")
e2=Ellipse(200,400,100,60,"#dce7f9")
e3=Ellipse(200,415,90,50,"#f8f8f9")
e4=Ellipse(245,320,35,45,"#f8f8f9")
e5 = Ellipse(250, 320, 28, 35, "#27e3fe")
e6 = Ellipse(247, 325, 25, 32, "#203be5")
e7 = Ellipse(244, 335, 12, 22, "#ecf1f9")
e8 = Ellipse(250, 322, 7, 20, "#203be5")
e9 = Ellipse(145, 285, 45, 55, "#f88033")
e10 = Ellipse(205, 590, 150, 410, "black")
e11 = Ellipse(125, 280, 25, 53, "#afc4f8")
e12 = Ellipse(120, 285, 22, 50, "#f8f8f9")
e13 = Ellipse(140, 284, 42, 55, "#f7ac49")
e16 = Ellipse(270, 295, 25, 53, "#dae6f9")
e17 = Ellipse(265, 291, 20, 75, "#afc4f8")
r1 = Rectangle(0, 400, 400, 200, "black")
n1 = Line(195, 270, 210, 265, 2, "#f88033")
n2 = Line(210, 265, 233, 264, 2, "#f88033")
n3 = Line(233, 264, 258, 273, 2, "#f88033")
n4 = Line(258, 273, 275, 290, 2, "#f88033")
n5 = Line(251, 362, 250, 385, 4, "#afc4f8")
n6 = Line(250, 385, 240, 410, 3, "#afc4f8")
n7 = Line(240, 410, 215, 436, 2, "#afc4f8")
n8 = Line(215, 436, 182, 453, 2, "#dce7f9")
n9 = Line(182, 453, 156, 456, 2, "#dce7f9")
e18 = Ellipse(166, 453, 20, 8, "#afc4f8")
n10 = Line(155, 455, 135, 480, 10, "#dce7f9")
c1 = Ellipse(126, 492, 18, 18, "#8c5179")
c2 = Ellipse(123, 495, 14, 14, "#a2617f")
c3 = Ellipse(118, 500, 5, 5, "#af9f7f")
e4.rotation = -20
e5.rotation = -20
e6.rotation = -30
e7.rotation = -50
e8.rotation = -55
e9.rotation = 50
e10.line_width = 35
e11.set_anchor(120, 320)
e12.set_anchor(120, 320)
e11.rotation = -10
e12.rotation = -10
e13.rotation = 50
e16.set_anchor(255, 325)
e17.set_anchor(255, 320)
e16.rotation = 15
e17.rotation = -20
e18.rotation = 10
def draw(dt):
window.clear()
bg.draw()
e1.draw()
r1.draw()
e2.draw()
e3.draw()
e9.draw()
e13.draw()
e10.stroke()
n5.draw()
n6.draw()
n7.draw()
n8.draw()
n9.draw()
e16.draw()
e17.draw()
e4.draw()
e5.draw()
e6.draw()
e7.draw()
e8.draw()
e11.draw()
e12.draw()
n1.draw()
n2.draw()
n3.draw()
n4.draw()
n10.draw()
e18.draw()
c1.draw()
c2.draw()
c3.draw()
repeat(draw)
run()
继续探索:让Dev动起来
添加一些简单的代码,就可以让代码绘制的Dev动起来,大家好好研究一下!
把你的答案写在留言区,跟大家一起来讨论吧~
网友评论