![游戏开发实战宝典](https://wfqqreader-1252317822.image.myqcloud.com/cover/212/44175212/b_44175212.jpg)
3.1 位图纹理
位图纹理是目前主流引擎采用的一种显示图像的机制。Egret引擎也是以这种方式来显示图像的。
3.1.1 基本知识
位图类Bitmap是Egret引擎里用来显示图片的,它的显示要基于一张纹理,该纹理需要通过外部资源来加载,也就是一张图片资源。
下面的案例将在舞台上绘制一张图像,从而让读者清楚如何使用位图纹理。
首先创建一个名为“BasicBitmap”的项目,删除 src 文件夹内的所有文件,然后创建一个名为Main.ts的类文件并做出如下修改,参见二维码3-1:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/59_01.jpg?sign=1739287186-jv8TtEAarcZKsjrBcovhGi80KCKM9xaT-0-d2aee729c91cb36986a4e4ed845272d7)
二维码3-1
运行调试播放器观看结果,如图3-1所示:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/59_02.jpg?sign=1739287186-58qAlJ02JtmSt3dHU4wkX0biHl9r20mf-0-22f7dd113077ba79b3915118e01fe655)
图3-1 程序运行结果(绘制位图)
在播放器的左上角显示出了白鹭的图标。
onAddToStage方法被标识为async是因为第11行到第13行的代码需要同步。第9行到第13行是资源加载的代码,关于资源加载功能,将在下一章里介绍,这里只需要知道这些代码加载了必要的资源就可以了。当资源加载完成之后,会回调 onGroupComplete 方法。代码的第17行创建了egret.Bitmap对象——image,在第18行,通过RES.getRes获取到一个资源id为egret_icon_png的纹理对象,并把它赋给image对象的texture属性。这样,image对象就有了纹理。然后在第19行将其放置到舞台上。
还可以绘制基于base64字符串数据纹理的位图。继续上一个项目,在Main类里继续添加如下代码:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/60_01.jpg?sign=1739287186-Uva0uxl1Z2WgLhmcy4Jxi7qhuiBwsdHA-0-d6929bfaa7e47adc7eb53df6874d2a64)
并对已有onGroupComplete方法做出如下修改:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/60_02.jpg?sign=1739287186-qCQtdnCG2W8mSMMYiaBXZdWwy0VJAn2o-0-e3fec6d0d2dc33c67758830d00055d4b)
运行调试播放器观看结果,如图3-2所示:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/60_03.jpg?sign=1739287186-ZsjgariWs5s5f9CSsFS3xJ1dhLkSfP1D-0-335faf673dc70f51f6f90a9f8998c4ce)
图3-2 程序运行结果(复制位图)
从运行结果可以看出在第一个图片的下方又显示了相同的图片。
在第一个代码清单里,第2行定义了一个基于base64数据的字符串——str64。第3行,通过egret.BitmapData.create方法创建一个基于base64字符串的纹理数据,并将其传递给为该方法指定的回调函数,这个被传递的数据对象就是bitmapData。第5行,将egret.Texture对象的bitmapData属性赋值为该数据对象。第6行,再用这个Texture对象去创建Bitmap对象,并将这个Bitmap对象放置到舞台上。
3.1.2 九宫格
有时候会有这样的需求,当拉伸一张位图的时候,希望它的边缘不被拉伸。这种情况下,就可以使用Bitmap自带的九宫格功能来实现这种效果,如图3-3所示。
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/61_01.jpg?sign=1739287186-h1PvzI3BlNWAT4627lUHhLoG3D76v7JP-0-541c1b7acd7ed21beb0e27fc22ec3cf0)
图3-3 九宫格(图片来源于Egret官方文档)
类似图3-3,当拉伸这个图片的时候,在九宫格的作用下,编号1、3、7、9的区域不会被拉伸;区域2、8仅会被横向拉伸;区域4、6仅会被纵向拉伸。
首先创建一个称为NineGrid的项目,删除src文件夹内的所有文件,然后创建一个名为Main.ts的类文件,并做出如下修改,参见二维码3-2:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/61_02.jpg?sign=1739287186-qsyVbefQZYRtzDKBqsyfVEC6ujay6lRY-0-6ecbcfe1d63e391db866d744bf852f82)
二维码3-2
运行调试播放器观看结果,如图3-4所示:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/61_03.jpg?sign=1739287186-fKS2OBnpRcmrgWWyAPFNY69VVpysatEA-0-4c74d4656cdeea8f168ccd6e0e3edd91)
图3-4 程序运行结果
第一张纹理的四个角被拉伸,第二张纹理的四个角没有被拉伸。
两张纹理的区别在代码的第31、32和33行。第31行代码定义了九宫格的区域,结合图3-1来解释一下该区域各个参数的意图:
第一个参数40表示区域1的宽度。
第二个参数40表示区域1的高度。
第三个参数176表示区域2的宽度。
第四个参数176表示区域4的高度。
在代码的第33行,将这个Rectangle对象赋值给image对象的scale9Grid属性,这样image对象就具备了九宫格功能。
注意:在正常情况下,九宫格区域的宽度和高度要小于图片的宽度和高度。如果九宫格的设置异常会报如下错误:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/62_01.jpg?sign=1739287186-RDDqlLJFQ8fg4ZhwwmwEZ6tHU39JVOfU-0-9498526ded50ee11ca3387727d6d156a)
3.1.3 纹理的填充方式
当位图被拉伸的时候,就会涉及其纹理的填充方式了。填充方式主要有两种:
● 拉伸图像以填充区域。
● 重复图像以填充区域。
下面的案例将展示图像的两种填充方式。
首先创建一个称为BitmapFillMode的项目,删除src文件夹内的所有文件,然后创建一个名为Main.ts的类文件,并对其做出如下修改,参见二维码3-3:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/62_02.jpg?sign=1739287186-lJseDYDn0z6SyuZMYCovS6h3IO6niHTs-0-c4cbd28a3e4788a91e2c21d1e8de5037)
二维码3-3
运行调试播放器观看结果,如图3-5所示:
白鹭图标位图被拉伸,这是位图对象默认的填充模式。接下来对代码做出如下修改:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/62_03.jpg?sign=1739287186-48itPpyHAuSBXogTBN9DWCgfGTtCkqHQ-0-9dc4925776c915a04c8c11d9bc6daac9)
运行调试播放器观看结果,如图3-6所示:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/62_04.jpg?sign=1739287186-TUKt9FDAzW7pDpFq4ZDb2lb1CKyVT2Pd-0-806ebfdeb8453d3e6793b1e39c61b898)
图3-5 程序运行结果(拉伸填充方式)
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/62_05.jpg?sign=1739287186-gTZNCaeScVgPbWoVQfia6ONNyafrh6lc-0-f48048d3957cdc2858f88421982b57ab)
图3-6 程序运行结果(重复填充方式)
从运行结果可以看出图片被重复填充了。这是因为通过修改的代码的第4行,将图片的填充模式改为 egret.BitmapFillMode.REPEAT,这样图片就实现了重复填充。
3.1.4 纹理集
有时候开发者想把所有的纹理文件放到同一个文件里,然后在项目里单独地使用里面的纹理。Egret引擎为此提供了纹理集的功能。
首先创建一个称为ImageSet的项目,删除src文件夹内的所有文件,然后创建一个名为 Main.ts 的类文件,然后做如下修改,参见二维码3-4:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/63_01.jpg?sign=1739287186-1P2USx4sXZgBuLBawGpdF5dQpzSZo09h-0-febef4fac4dafa191ebf1bbebd3eaff6)
二维码3-4
项目里还带两个资源文件:dogs.json和dogs.png。以下是dogs.json的内容,它的资源类型是sheet,参见二维码3-5:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/63_02.jpg?sign=1739287186-KUtN0Vr8LI0GLdSPAJ5PsDkPAJJa8SDe-0-448512afeb0264d881d17a5060cf1c94)
二维码3-5
以下是dogs.png文件的内容,如图3-7所示:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/63_03.jpg?sign=1739287186-FV888mClssQDx0vXnhQYHte9ZoyryeIK-0-e340612337e5a7e8794354408b8bfbcb)
图3-7 图片的内容
运行调试播放器观看结果,如图3-8所示:
代码的关键在第18行,其中dogs_json为纹理集,dog1是纹理集的id。
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/64_01.jpg?sign=1739287186-xF2USd0c6e9OyK8CnIaCUn7J00x0eflv-0-4d616019c6dbcb3ffc9d84cf56a2cba4)
图3-8 程序运行结果(纹理集)