![游戏开发实战宝典](https://wfqqreader-1252317822.image.myqcloud.com/cover/212/44175212/b_44175212.jpg)
2.4 矢量绘图
本节将讲解矢量绘图。上一节讲到 graphics 对象是绘制矢量图形的关键,它具备绘制矢量图形的全部功能。本节将更具体地讲解一下它的其他用法。
graphics对象的类型是Graphics,这个类不能直接使用,而是需要在一些显示对象,比如Shape和Sprite类里间接使用。
上一节已经讲解了如何绘制矩形,这一节将重点介绍如何绘制圆形、直线、曲线、圆弧,这些代码都来源于Egret的官方文档。
2.4.1 绘制圆形
首先创建一个称为“GraphicsDrawing”的项目,删除 src 里的所有文件,然后创建一个称为Main.ts的类文件,添加如下代码,参见二维码2-11:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/39_02.jpg?sign=1739293429-yW3PkY6GVzGD2Amt2MZ9SNl7arCPcWBD-0-e3b4ad68316a20c4f0342b7bfbb4cd8c)
二维码2-11
运行调试播放器,会看到这样的运行效果,如图2-28所示:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/39_03.jpg?sign=1739293429-oPoxT5039MnlNdiUPIg766ou0lfuwONC-0-c46ccb945362c60e657c9ceff96be2bf)
图2-28 程序运行结果(绘制圆形)
上面的代码首先创建了一个Shape类型的对象——shape(第13行),然后把它的坐标设置为(100, 100)(第14、15行)。然后设置了边框的样式(第16行),这里使用lineStyle方法来设置边框样式,如果是绘制直线,那它的作用就是设置线的样式。它的原型如下:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/39_04.jpg?sign=1739293429-7aDnDr29vWzSDPMQwDOUs3iwfq2lMIxp-0-6cbc5a389abc45616b2caca16e44ebe4)
它的参数都是可选的。以下是对各个参数的解释:
● thickness:一个整数,以点为单位表示线条的粗细,有效值为0~255。如果未指定数字,或者未定义该参数,则不绘制线条。如果传递的值小于0,则默认值为0。值0表示极细的粗细;最大粗细为255。如果传递的值大于255,则默认值为255。
● color:线条的十六进制颜色值(例如,红色为0xFF0000,蓝色为0x0000FF 等)。如果未指明值,则默认值为0x000000(黑色)。可选。
● alpha:表示线条颜色的 Alpha 值的数字;有效值为0~1。如果未指明值,则默认值为1(纯色)。如果值小于0,则默认值为0。如果值大于1,则默认值为1。
● pixelHinting:布尔型值,指定是否提示笔触采用完整像素。它同时影响曲线锚点的位置以及线条笔触大小本身。在 pixelHinting 设置为 true 的情况下,线条宽度会调整到完整像素宽度。在 pixelHinting 设置为 false 的情况下,对于曲线和直线可能会出现脱节。
● scaleMode:用于指定要使用的比例模式。
● caps:用于指定线条末端处端点类型的CapsStyle类的值。默认值:CapsStyle.ROUND。
● joints:指定用于拐角的连接外观的类型。默认值:JointStyle.ROUND。
● miterLimit:用于表示剪切斜接的极限值的数字。
● lineDash:设置虚线样式。
在第18行,使用drawCircle方法来绘制圆形,它的原型如下:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/40_01.jpg?sign=1739293429-ZrVZpce5hHC528RnkSh0HFZH1SRf6J7R-0-768b26c48d997e62e3a527475d9e1788)
以下是对各个参数的解释:
● x:圆心的x坐标,相对父显示对象x坐标的水平距离。
● y:圆心的y坐标,相对父显示对象y坐标的垂直距离。
● radius:圆的半径(以像素为单位)。
2.4.2 绘制直线
继续刚才的项目,在Main类里继续添加如下的代码,参见二维码2-12:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/40_02.jpg?sign=1739293429-Je38lfBUEjSdGh4rqWHPz8zRSTaEk2QG-0-7c4b2837ff6ff6f8eb26324a5f328dd6)
二维码2-12
而且onAddToStage方法也要做出修改:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/40_03.jpg?sign=1739293429-4eIPFRpDCPN1Mfbal7ms131Z5PsNq2et-0-0f8d2801cb45916c4815dcf86d3b79ef)
运行调试播放器观看结果,如图2-29所示:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/40_04.jpg?sign=1739293429-wkKvPa0dgM2TEt39KIIzGC4OKXRocLRW-0-aa7bee76df45251fbea5f1792ba6652c)
图2-29 程序运行结果(绘制直线)
程序绘制出几个不规则但是连续的直线。
在drawLines方法里,代码在第3行设置了直线的样式,其中的lineStyle方法已经在上一节讲过了。第4 行代码将直线的起点设置为(68, 84),这个坐标是相对于父节点——shape对象的。其中的moveTo方法原型如下:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/41_01.jpg?sign=1739293429-Zoo1vImaXmDgitt0gS0G6KfDAe3dmkLT-0-f7c43ef97cd003498067006c0625395d)
以下是对各个参数的解释:
● x:起点的x坐标,相对父显示对象x坐标的水平距离。
● y:起点的y坐标,相对父显示对象y坐标的垂直距离。
第5行代码将直线的下一个点设置为(167, 76),并且在起点和该点之间,根据直线样式绘制一条直线。其中的lineTo方法原型如下:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/41_02.jpg?sign=1739293429-8KFNgtOa53eFCIt3lbgqaby9EKEBVGLL-0-720a09ca3305b70bd38b3c39cd1fd64b)
以下是对各个参数的解释:
● x:下一个点的x坐标,相对父显示对象x坐标的水平距离。
● y:下一个点的y坐标,相对父显示对象y坐标的垂直距离。
第6行代码将直线的下一个点设置为(221, 118),并且在上一个点和该点之间,根据直线样式绘制一条直线。随后代码的作用是一样的。
在onAddToStage方法里,调用drawLines方法才能将这些直线放到舞台上。
2.4.3 绘制曲线
Egret里使用的曲线绘制方法采用二次贝塞尔曲线方法,图2-30是二次贝塞尔曲线的结构图:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/41_03.jpg?sign=1739293429-Yhh3QqBsMkdsUcwatCHMhDJcohpvI84m-0-c433f9b634b95f3d562c415f6692645b)
图2-30 曲线的结构(图片来源于Egret官方文档)
其中P0是起始点,P1是控制点,P2是终点。
继续之前的项目,在Main类里继续添加如下的代码:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/41_04.jpg?sign=1739293429-dNgIJTny7Nde5OzeXK7PkF5oJ0vagBnp-0-45ecd79ba3de37538c70ab6104c492e7)
而且onAddToStage方法也要做出修改:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/42_01.jpg?sign=1739293429-mq7baChOmu7IvtxbwlX69KAlUISKCawv-0-34ac33cfe51dc6944b2705e7e9eebbb3)
运行调试播放器观看结果,如图2-31所示:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/42_02.jpg?sign=1739293429-LZSGRSQCNtU3bqMFmpz7ehnThk2da2Ib-0-76c04cd3e8fba033f72baffbb6b8e64d)
图2-31 程序运行结果(绘制曲线)
程序在直线段下方绘制出一段曲线。
接着在drawCurve方法里,代码在第4行将曲线的起点设置为(50, 250),即图2-30中的P0,第5行代码将绘制出一段曲线,其中的curveTo方法的原型如下(结合图2-30):
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/42_03.jpg?sign=1739293429-yBQK0sIaHcy0VhCPNDJhuxULF6WlwIcW-0-599df8fceefd5e26aa6507db5ae3cc36)
以下是对各个参数的解释:
● controlX:控制点P1的x坐标,相对父显示对象x坐标的水平距离。
● controlY:控制点P1的y坐标,相对父显示对象y坐标的垂直距离。
● anchorX:锚点P2的x坐标,相对父显示对象x坐标的水平距离。
● anchorY:锚点P2的y坐标,相对父显示对象y坐标的垂直距离。
在onAddToStage方法里,调用drawCurve方法才能将这个曲线放到舞台上。
2.4.4 绘制圆弧
继续之前的项目,在Main类里继续添加如下的代码:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/42_04.jpg?sign=1739293429-nUGp1beGA01SSuqgDSXuYOfCbbAIzg1L-0-dab7f2826421b3d4fd174c482062e835)
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/43_01.jpg?sign=1739293429-aPEFuzPtuCmpIanCSB06v7NvpL4ShDHl-0-bdb48be2f664ee90732947e317e65680)
而且onAddToStage方法也要做出修改:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/43_02.jpg?sign=1739293429-V8iajrgtRL8dbhz0AXi4BBhqdDTJa9df-0-2cba6e8b75dbeaa9a03716e7002689c9)
运行调试播放器观看结果,如图2-32所示:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/43_03.jpg?sign=1739293429-NG9Hm8NhijTswXdm40KZYDErk5CzSOcT-0-2dfc6f8a8bd7ce7e481331bab52e5839)
图2-32 程序运行结果(绘制圆弧)
在曲线下方绘制出一个弧形。
在drawArc方法里,代码在第4行绘制了一个圆弧,其中的drawArc方法的原型如下:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/43_04.jpg?sign=1739293429-FBiEO3XLqb3LhDkOpzrGjysTSf6VrbSE-0-2f16228f6afce477b795a2138475da8a)
以下是对各个参数的解释:
● x:圆弧中心(圆心)的x轴坐标,相对父显示对象x坐标的水平距离。
● y:圆弧中心(圆心)的y轴坐标,相对父显示对象y坐标的垂直距离。
● radius:圆弧的半径。
● startAngle:圆弧的起始点,由x轴方向开始计算,单位以弧度表示。
● endAngle:圆弧的终点,单位以弧度表示。
● anticlockwise:如果为 true,逆时针绘制圆弧,反之,顺时针绘制。该参数是可选的,如果没指定这个参数,则按顺时针绘制。