大家有没有思考过一个问题?小的时候我们是如何认识这个世界的?记事儿比较早的朋友们可以稍微回忆一下自己认识世界的过程,实在记不住的话可以看看笔者以下这段文字。
人们面对新事物总会产生好奇,随即便是去探索,探索的过程即是逐步的去学习和认知这一新事物,对于一两岁大的孩子来说,每天每时每刻呈现在他们面前的东西都是新鲜、未知的。笔者在自己女儿的眼里就经常能看到一道光,当她看到一件事物的时候,眼里总是这样闪闪发光,这种求知的欲望有时候用语言很难以表达。
还是回到主题上来,为什么要学编程,古老的华夏文明自古以来读书的目的都很明确——出人头地,出人头地的衡量标准也甚是清晰——高官厚禄。而笔者对此一直也无法苟同,愚以为,人如果看到很有趣的东西,却又不知道这个东西为何如此有趣,这个时候心里面会产生一种难以名状的不痛快,于是会萌生研究它的欲望,等到搞清楚这里面的各种原理之后,心里那种不痛快才会消失,所以读书学习是为了——快乐!计算机是20世纪的高科技产物,随着这些年技术的飞速发展,它已经成为了各个行业不可或缺的一种生产工具,众所周知,计算机由硬件系统和软件系统两大部分组成,相对于一成不变的硬件系统来说,今天计算机之所以能实现这么丰富的用途,都是因为软件的设计、编写和应用,而软件通常就是通过所谓的编程来实现的产物。所以,通过计算机编程的学习,人们能从一个独特的角度去认知现在的这个世界,比如说:城市道路上的交通灯的变换规律、楼宇升降电梯的调度顺序、银行证券中心的交易流程、股票期货的预期走势……甚至是妈妈做饭的手艺、爸爸钓鱼的技巧……凭借计算机高速的运算能力,人们可以通过编写程序来模拟这个世界运行的一切一切,因此学习编程即是学习认知世界。
虽然咱们的大标题看似是给小朋友学编程,但笔者认为这对很多成年人也会有一定的启发,特别是在你亲手带着孩子通过编程创建了一些东西并成功运行起来之后。
什么是程序(What is program?)
程序,顾名思义就是一件或几件事情的始末过程,这有点像小学语文里学过的记叙文,大家应该都还记得记叙文的几大要素吧?时间、地点、人物、故事的开端、过程和结尾。哈哈,没错,这就是一个程序。我们可以把程序看成是在计算机内部发生的一个或一些列的故事,程序开始执行的时候故事就开始了,随着程序的结束,故事也就收尾了。
为什么要编程(Why program?)
既然程序就像是一篇记叙作文,那么编写程序的过程就类似于写一个故事,想想小学老师是怎样教小学生写记叙文的?笔者的语文可能真的是体育老师教的,写到这一段竟卡了一个多小时……于是乎,遂决定求助一下互联网,打开一个搜索引擎(别问是什么搜索引擎,反正不是baidu),输入“怎样写好记叙文”……笔者大概查到了以下的一些零散的信息:
环境的描写:这部分主要是烘托气氛,交代时间、背景的故事要素;
人物的刻画:这部分主要是塑造人物,让即将发生的故事变得有血有肉;
事件的叙述:这部分则是讲述之前塑造的人物在之前前设计好的环境中的所作所为以及他的目的、手段、结果等等(当然可能还会有人物的内心活动神马的)。
从编程的角度来理解,需要做好以下相应的几件事:
场景设计:这部分是为了让程序运行起来的时候看起来像是这么回事;
角色设计:这部分则是定义好将要参与到程序中的各个角色以及他们的属性,以确保他们在程序当中能按照预期来行动;
行为设计:行为则是推动整个程序向前发展的重要因素,不同的角色由于拥有这不同的属性,所以在事件过程中应该能够触发其各自不同的行为。
以上,就是之所以编程的原因,编程的目的就是为了讲一个故事,当然最好是一个合理、完整的、符合逻辑又不乏美感的故事。
怎样编程(How to program?)
怎样xxx,其实这是一个很普遍性的问题,编程跟很多事情都一样,在 这个问题中大家可以试着把“编程”换成别的什么行为,不难发现,得出的答案都是差不多的。
首先,工欲善其事,必先利其器,做任何事情之前,都应该准备好一套衬手的工具,因为各位是人类,人类区别于低等生物的一大标志就是工具的制造与使用,哈哈哈哈~ 在这个编程教学的过程中,用到的工具是来自麻省理工大学的一个开源项目——Scratch,大家可以自行到其官方网站去做更多了解(https://scratch.mit.edu/)可以通过网页浏览器进行在线编程,也可以将Scratch下载到本地进行离线编程,下载链接在这儿(https://scratch.mit.edu/download),Scratch提供了跨越多个平台(Windows、macOS、Liunx)的离线编辑器,你们根据自己电脑的系统类型选择下载就好了。安装就不说了,双击下一步下一步……之类的常规操作。
接下来,开始去构思整个程序吧,这个过程涉及需要我们带着孩子一起做一些思维体操,在形象思维与抽象思维之间来回的切换、对比、匹配、延伸……具体的操作在下文中笔者会尽力描述好所有的细节以保证整个课程的可操作性。
最后,当我们设计好了所有的事情,还应该有一个很重要的步骤就是测试与调试,这个流程在软件工程当中也是至关重要的一环,它是保证软件质量很关键的一步,就像写完作文还需要从头到尾阅读一遍,然后修改一些错别字、点错的标点符号、不恰当的修辞等等,在计算机行业内称为bug。
工具简介(About Scratch UI)
以离线版Scratch为例,带大家简单认识一下这个好玩的东东,主界面如下:
在线版本界面也差不多,接下来简单介绍一下各个部分的功能。
菜单栏: 跟大家用过的多数软件界面一样,菜单栏以按钮和下拉菜单的形式为我们提供了一些软件的操作功能。
功能如下:
语言菜单(小地球):点开这个菜单,可以进行界面的语言选择;
文件菜单:点开这个菜单,可以进行新建、保存、倒入等基本操作;
编辑菜单:点开这个菜单,可以对已删除的角色进行复原(类似word里面ctrl+z的撤销功能)和加速模式开关(类似一些音乐视频播放器立的快进功能);
教程菜单:点开这个菜单,可以观看随软件安装到本地计算机上的教程资源。
代码/工具选择区: Scratch的一大特色就是将代码以积木的形式呈现给用户,这样的设计与人们刻板印象中的编程截然不同,不再是枯燥的输入一堆又一堆正常人类看不明白的字符,而是像搭积木一样来构建需要的功能。
功能如下:
积木类型选择:代码区的积木按照一定的类型进行了区分,可以通过点击 类型快速切换到所选类型的积木堆里;
积木选择:能实现具体功能的积木,这里的每一个积木其实就是编程语言里的函数,除了官方给出的这些常用积木之外,还可以根据自己的续期自制积木,有编程基础的同学可以将这一区域理解成函数库;
图片编辑:可以在这里导入或自行绘制角色和背景图片,也可以对资源库中的图片进行编辑修改;
声音编辑:可以在这里导入或自行录制声音片段。
代码/图片/声音编辑区: 在选择区里选择的积木、加工好的角色或背景图片、录好的声音片段都会呈现在这个区域进行组合编辑,这里便是大家施展魔法各显神通的区域。
舞台区: 舞台是运行程序的地方,在编辑区所施展的魔法效果会统统的在舞台上展现出来。舞台通过一个看不见的二维坐标来表示台上的每一个位置,X轴范围(-273,273),Y轴范围(-215,215)。
舞台/角色设置区: 在这里可以对程序中的图像元素(背景、角色)进行一些基本的调整,如:命名、显示、隐藏、大小尺寸、位置坐标。
以上就是Scratch操作界面的简单介绍,大家还可以通过软件内置的教程或官方在线文档来学习更多关于Scratch的细节。
为孩子讲一个故事(A short story)
故事概要(Outline)
第一个故事叫:爱吃甜甜圈的霸王龙。很久很久以前,地球上住着一只霸王龙,大家都叫他泰伦哥哥,他有着绿绿的皮肤、大大的嘴巴、尖尖的利齿、粗壮的大腿、细细前爪以及一条走起路来摆来摆去的长尾巴,他叫起来的声音震耳欲聋非常的吓人——“吼吼吼~”
虽然泰伦哥哥的样子很可怕,但是他却跟所有的小朋友一样超喜欢吃甜甜的东西,比如蛋糕店里的甜甜圈就是他的最爱。
泰伦哥哥是一只非常幸运的宝宝,因为上天知道他喜欢吃甜甜圈,于是每天都会从天上给他扔下很多很多的甜甜圈,每天都能吃上甜甜圈的泰伦哥哥别提有多开心了!
场景介绍(Scene)
故事发生在白垩纪时期的地球(距今几千万年前),那时的天空很蓝、白云朵朵挂在天空中,地球上到处都是茂密的森林、广阔的草地、活跃的火山……在这片广阔天地之下生活着很多史前生物,他们都是主角泰伦哥哥的小伙伴,他们每天无忧无虑,一起开心地玩耍、吃饭、喝水、睡呼呼……
登场角色(Characters)
泰伦哥哥:泰伦哥哥是一只霸王龙,霸王龙生存于距今6850万年到6500万年的白垩纪末期,是白垩纪-第三纪灭绝事件前最后的非鸟类的恐龙种类之一。成年霸王龙体长约11.5-14.2米,平均臀部高度约4米,最高臀高可达5.2米左右,头高近6米,平均体重约9吨,最终可达14.85吨,头部长度大约1.55米。咬合力一般9-12万牛顿,嘴巴末端最大可达20万牛顿左右,是体型最为粗壮的食肉恐龙。故事中的泰伦哥哥跟他的其他同类相比要略显可爱,因为他最喜欢吃甜甜圈 而不是其他的弱小动物。
甜甜圈:甜甜圈,又称多拿滋、唐纳滋,它是一种用面粉、白砂糖、奶油和鸡蛋混合之后再经过油炸的甜食。甜甜圈最普遍的两种形状是中空的环状、或面团中间有包入奶油、蛋浆(泛指蛋打成的液体)等甜馅料的封闭型甜甜圈。故事中的甜甜圈被不断地从天空中抛洒下来,用以投喂故事的主角泰伦哥哥。
其他角色:故事中可以辅以一些其他的小动物来令场景更加丰富有趣,比如天上飞的始祖鸟、翼手龙,地上跑的其他草食类小恐龙之类。
主要事件(Events)
甜甜圈雨:天上不停的掉下来好多好多的甜甜圈,泰伦哥哥和他的小伙伴们开心坏了。
构思故事中的世界(Design the world)
舞台(Stage)
首先舞台需要一张蓝天草地的图片,作为故事的背景环境,有美术功底的同学可以自行创作,没有美术功底的同学也不用发愁,scratch本身为大家提供了大量的素材,对于一些简单的制作还是可以满足的。
废话不多说,开始动手布置舞台吧,首先在Scratch界面的右下角的舞台调整区里找到选择一个背景的按钮,
点击之后会弹出Scratch内建的背景资源库,找到想要的背景,
选中后,背景图就出现在了舞台设置区并同时出现在舞台区,就像这个样子。
舞台场景可以添加多个,并根据游戏情节的发展进行切换,由于这个是小朋友的第一个作品,可以先稍微简单一点实现一个单一的静态场景即可。
如果在资源库里是在找不到想要的图片资源,那就只好到互联网上各大图片网站去搜集咯,而PS达人可以自行创作,那么问题就来了,P图到底哪家强?
角色(Sprite)
接下来开始敲定角色,按照之前故事的设定,这个程序中至少需要准备两个角色——霸王龙泰伦哥哥以及甜甜圈。
首先去找到泰伦哥哥,在角色设置区找到选择角色按钮,
点击之后一样会进入到Scratch的角色资源库,
终于找到了想要的小家伙,
做到这一步的时候,笔者的女儿发现了问题,她认为泰伦哥哥个头太大了,几乎占据整个场景的一半,看起来很可怕,而且泰伦哥哥看起来似乎飘在天上。。。没错,这就是孩子的观察力以及她的世界观,女儿说的有道理,首先场景面积有限,角色如果过大后面在设计动作的时候就会耍不开,而且角色放置的位置也要符合逻辑,霸王龙怎么可能在天上飞呢?于是笔者决定表扬女儿敏锐的观察力并一起着手进行调整,最终调整成为上图的样子,女儿看过后,满意的点了点头。
接下来,去找泰伦哥哥爱吃的甜甜圈,刚好Scratch资源库里也有甜甜圈可供选择,得来全不费功夫,挑选过程和找到泰伦哥哥的步骤一样,在这里就不赘述了,直接看最终结果图吧,
这样,游戏中的主要角色们就都到齐了,女儿高兴的不行,大声的说,人都到齐了,做点好玩的事情吧!!!
没错,既然大家都到了,接下来就得让他们开始干活了!
喔~对了,细心的小伙伴在选择泰伦哥哥这个角色的时候,不知有没有注意观察到泰伦哥哥的形象还有一些被官方预先设定好的很好玩的属性,在接下来的制作过程中再来讲解。
行为分析(Behavior analysis)
分析是整件事情里至关重要的一个步骤,大朋友可以带着小朋友一起来分析游戏中各个角色的行动规律,逐渐的养成做任何事情之前都线分析再动手去做,须知,未经分析的行为,在不久的将来都会出现问题,中国的古人也常说,三思而后行。这部分对于培养小朋友的想象力以及思维缜密性和发散性很有帮助,笔者的建议是,对于小朋友分析设计的行为,成年人不要给予过多的限制,特别是用成年人世界里的知识框架去限制小朋友的发挥,万万使不得,多提建议少设障碍。好莱坞动画片《狮子王》里的小辛巴都会对他未来的宰相沙祖说“Kings don’t need advice from little hornbills for a start.“大概意思就是:我堂堂未来的森林之王,为什么要听你这种小人物的建议!所有的年少都少不了轻狂,在孩子成长过程中这是必经阶段,父母们不必过分在意甚至强加阻拦,“Let it go”就好了。Well,我们开始按照最初的设计对主要角色的行为进行分析,再提醒一下下,我们只是进谏的大臣,最后的决定权在小朋友手里,哪怕最后做砸了也没关系。
先来看看泰伦哥哥,根据我们的设定游戏中这只小霸王龙主要的任务就是不停的吃甜甜圈,当然他还可以做很多别的事情,这是小朋友们说了算的,但是,还是先让小恐龙做好一件事吧,其他的可以后续慢慢增加,就像一个软件从最开始的基本功能随着时间的推移版本的迭代,功能逐渐丰富的过程一样,我们这个游戏也可以不断的推出后续升级改进版本,哈哈哈哈~ 但是眼下,我们还是先解决泰伦哥哥的吃饭问题!那么泰伦哥哥怎样才能吃到甜甜圈呢?这要取决于甜甜圈在哪,按照最初设定,甜甜圈是像下雨一样从天而降的,带着小朋友一起思考一个问题,下雨有什么特点?我们也不妨做一个表格来将角色的行为规范进行总结和呈现,表格是人们日常工作很常用的工具,不论是乾隆爷那会儿手工绘制的表格还是现在的电子表格,其优势就在于它具备良好的关联性、总结性以及视觉上的直观性,是一个很好的统计和报告工具。废话不多说,我们把角色行为表格呈现如下:
角色 | 数量 | 出现位置 | 移动范围 | 移动方向 | 可交互 |
---|---|---|---|---|---|
泰伦 | 1 | 舞台底部 | (3,4) | 左右(水平) | 是 |
甜甜圈 | N | 舞台顶部 | (1,4)或(2,3) | 至上而下(垂直) | 否 |
这个表格的部分,笔者的女儿年纪还小,不太能够理解,所以笔者就默默的自己做出来了,如果小朋友到了学龄的,可以尝试给讲解一下。移动范围部分笔者稍微说明一下,之前应该有提到过舞台其实是一个二维平面坐标,那么移动范围笔者就用到了“象限”这个概念来呈现,可能不是很合适,大家也可以发挥自己的聪明才智用更适合小朋友的方式来描述。其实这个表应该还可以统计更多的行为来,篇幅有限,就先呈现这些吧。
另外一件值得一提的事情,因为我们做的是一个游戏,而不是一个动画短片什么的,游戏的特点就是需要和玩家有互动,这个互动的实现是通过主角泰伦哥哥来实现,大多数小朋友在听完这个故事之后应该都会希望泰伦哥哥能吃到多多的甜甜圈吧?那么泰伦到底能吃到多少甜甜圈呢?如果这个结果掌握在小朋友的手里事情就会变得有趣了起来,所以我们在泰伦身上还要实现一个可操作的特性,即泰伦哥哥的行动由玩家自己来控制;而甜甜圈不会跟玩家直接互动,但是它应该跟游戏里的其他内容互动,因为是游戏就会有输与赢、成功与失败,那么甜甜圈的另一项行为可以直接用于判断成功与失败就是最后落到了哪里?我们可以认为甜甜圈落到泰伦哥哥嘴里即是成功,落到地上即是失败。
好了,行为分析就先到这里,具体的实现方法,大家继续往下看吧。本来还有一些更有用的工具可以引入进来,但考虑到这是第一个案例以及小朋友的接受能力,暂时就不用在这里先了。
开始着手建造世界(Build the world)
这部分工作至关重要,因为我们要开始在编辑区里基于之前的分析结果来施展相应的魔法了,其实就是将我们设计好的内容抽象化成编辑区里的积木组合,即是正式开始编码了。
场景建造
本案例中的场景是最简单的一种,即在整个游戏过程当中静静的做一副背景就可以了,所以编码上也很简单(甚至可以不用任何编码,因为默认他就挂载那里,如果要严谨一点的话也可以为它施以魔法,这样能将Scratch的原理进一步理解)。废话不多说,来看看界面:
现在右下角点击一下舞台设置区,然后编辑区域回切换到舞台编辑模式,通过编辑区右上角以半透明显示的预览图可以判断出当前编辑的对象是谁。 这时候从左边的积木选择区域中拉到编辑区里的积木都会作用于选中的这个背景,可以理解为我们在定义当前对象的属性和行为。这个例子中的场景可以不用任何积木来定义,使用它的默认属性即可(即,放空编辑区,不用拖入任何积木)。
角色创建
按照由浅入深的顺序,我们可以先把行为较为简单的甜甜圈创建出来,然后再去创建泰伦哥哥,泰伦哥哥背负了太多的使命,使得他的属性和行为要比甜甜圈复杂的多。
创建甜甜圈
先在右下角角色设置区的角色列表当中点一下甜甜圈,确保接下来编辑的对象是甜甜圈,然后开始对甜甜圈编程得到下图结果:
那么现在甜甜圈编辑区里用到的积木就是这些,大家也可以通过逐一的尝试和观察来了解不同的积木所带来的效果,因为之前有说过,你在编辑区里放置的任何积木所带来的效果,都会直接呈现在右边的舞台区里,可谓是非常直观。
先介绍一下脚本这个东西:
首先,甜甜圈的行为由两组积木组合来共同完成,每一组积木称之为一个脚本(Script),脚本的定义好像最早是在影视拍摄中,由导演或执行导演在拍摄前编写,用于描述剧中的演员登场的时间顺序、时间长度、台词、动作等……拍摄期间演员们的表演则需要按照脚本中描述的顺序以及行为进行表演,其实就是一系列简单的指令,在拍摄的过程中用于提示演员该做什么该说什么;
其次,早期的计算机脚本语言经常被称为批处理语言或工作控制语言,一个脚本通常是解释运行而非编译。脚本语言通常都有简单、易学、易用的特性,目的就是希望能让程序员快速完成程序的编写工作。
然后对甜甜圈角色用到的两个脚本详细说明一下:
对象行为-1(脚本-1)中用到了7块积木,当“绿旗被点击”甜甜圈先“隐藏”自己>依次不停的“重复执行”三个动作:“等待1秒”>“移动到一个坐标点”>“克隆自己”,这当中克隆自己的坐标点在每次执行的时候都会发生一个变化,什么变化呢?就是x轴上的位置变化,变化的左边范围在-200到200之间,而y轴数值保持恒定,这样所产生的效果就是游戏开始的时候甜甜圈就开始在舞台顶部一个固定的高度上以每秒1个的速度横向的创建自己的复制体;
对象行为-2(脚本-2)中用到了9块积木,这组脚本定义了每个复制体出现之后的事情,每当一个“克隆体被启动”>先”显示“自己>依次“重复执行两个动作:“y坐标增加-5”>判断在“碰到舞台边缘或者霸王龙角色”的情况下“隐藏”自己,这里除了用到“重复执行”这个积木以外,还在重复执行的同时进行了一个条件的判断,而条件是是包含了两个事件的复合条件(碰到舞台边缘和碰到霸王龙角色)。
说到这,其实稍微有一点点计算机基础的大朋友们都会发现,这个“重复执行”不就是计算机编程语言里的循环语句(for语句)么?而这个条件判断不就是(if语句)么?老铁,没毛病,所谓的脚本其实就是一系列的循环和条件判断控制下的行为序列。大家也可以带着小朋友一起思考一下,我们的生活中还有没有什么循环和条件判断的例子呢?
创建泰伦哥哥
在右下角角色设置区的角色列表当中点一下泰伦哥哥,确保接下来编辑的对象是泰伦哥哥,然后开始对泰伦哥哥编程得到下图结果:
泰伦哥哥的行为要比甜甜圈复杂一些,这个创建过程年纪小一些的小朋友可能没法理解,但是没关系,他们会有很多的想法,我们可以按照小朋友提出的想法去帮助他们实现出来,然后再反过来让小朋友自己验证是不是自己想象中的样子,笔者的女儿在这里就碰到了理解力的天花板,没有办法自己完成设计,想了很久之后,个人认为不能强求小朋友做一些超越自己年纪所能理解的事情,这样会造成揠苗助长的效果,会打击小朋友的信心和兴趣。
下面解释一下霸王龙泰伦哥哥的三组行为:
对象行为-1(脚本-1)定义了从“旗标”被点击开始先将角色移放置到坐标(0,-117)然后将角色设置为显示,之后进入一个持续的循环,在循环中嵌入了两个条件判断,分别用于判断两个键盘按键(左、右方向键)是否被按下,如果左方向键被按下,霸王龙角色将会调整面向为面向左侧, 并且开始向左移动,如果方向键右被按下,则会面向右侧并向右侧移动,积木“面向xx方向”和“将x坐标增加xx”当中的参数分别用于调整角色的反转角度和移动速度。这是一种典型的人机交互语句,我们都知道,计算机通过外部的输入输出(I/O)设备,如:显示器、键盘、鼠标、摄像头、触摸屏、打印机、扫描仪等设备来与人类的世界进行互动,其中键盘和显示器是最为典型的输入和输出设备(专业术语里成为默认输入和默认输出),我们通过键盘可以向机器输入指令,机器则会通过显示器来向我们反馈指令的结果,计算机之所以能够迅速快捷地响应人们的各种操作,就是因为软件会一直(循环)地监视计算机上的各个输入设备,一旦人们对这些设备进行操作(即:键盘事件、鼠标事件……等),机器将会做出相应的操作并通过显示器或其他的一些输出设备反馈出来结果。是不是很有趣呢?
对象行为-2、3(脚本-2、3)定义了泰伦哥哥的其他一些动作,因为它是游戏的主角,在设计过程中,泰伦哥哥的行为是否合理是否复合逻辑会是小朋友们关注的焦点,当第一组行为编写完毕的时候,笔者的女儿就问过一个问题:“霸王龙走起路来,不是应该尾巴摆来摆去的么?”噢~笔者突然想起来之前有带她看过侏罗纪世界等等这些描写恐龙的电影,她对当中的霸王龙形象记忆犹新,而刚好笔者也发现这次选择的这个霸王龙形象并不是一副静态的图片,于是就开始着手奥本制作第2和第3组行为脚本。第2组脚本定义了霸王龙行走时的姿态,目标是要让霸王龙走路的时候尾巴摆起来(而不是像个鬼一样一动不动的左右平移),第3组脚本则是定义霸王龙吃甜甜圈时的姿态,吃东西总得张开嘴巴对吧?这一系列动态如何展示呢?相信大家都知道动图(GIF)对吧?这种格式的图片原理其实就是帧动画的原理,将一个运动中的物体的不同形态分解成独立的帧并桉顺序并设置一定的播放间隔时间,就这么简单,我们发现Scratch提供的这只霸王龙形象其实就是个动态图,一共由4个静态的形象构成,这个我们可以在右下角选中角色图片后再点击左上方编辑区的造型标签看到图片的具体属性。然后就可以对这两组动态进行编程了,跟脚本-1的思路一样,泰伦哥哥的动作取决于一些事件,所以我们需要在一个循环之中通过嵌套条件判断来决定是否执行造型的切换。
造型查看与编辑如下图:
这里我们不需要编辑这个造型了,因为是现成的,今后如果我们要自己创造造型的时候再考虑使用这个内置的图形编辑工具吧。