![游戏开发实战宝典](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=1739554112-xRlRFQrd183YjoNJYlAVna7zHcs35pU9-0-e17a3d5db79ed16ac2f97293e9fdfb6a)
二维码3-1
运行调试播放器观看结果,如图3-1所示:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/59_02.jpg?sign=1739554112-51Frm58wlvpkQ7Gw1klz9H0Jb1Xrzq0l-0-36236d0223cfc572e39b43991d9d73ac)
图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=1739554112-mbMIkCovtG2DzHWPieBWgGPz6ylQbmTQ-0-cce6d271c568eab498694e2c20924a0b)
并对已有onGroupComplete方法做出如下修改:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/60_02.jpg?sign=1739554112-SkJu67MlC0w6n6uoUgS7qL2beVdje6uu-0-72f504342e6a75d94721ff703ba65b76)
运行调试播放器观看结果,如图3-2所示:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/60_03.jpg?sign=1739554112-CitrEjbMHRrMZ3LVE8hFZJmwnnI0eK3l-0-54dcf78d9296af1818cea5d9048bb5e1)
图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=1739554112-noHbfVzf6MgeQyDffgxFhcgEar0fSlYi-0-9a6afc0ddd802e26beba07bd0e3569ec)
图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=1739554112-ml5wix6xehUUmimNhz7IqYUUJSv7vAEn-0-5131ee3c282012c0540f7e01ad5d3daf)
二维码3-2
运行调试播放器观看结果,如图3-4所示:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/61_03.jpg?sign=1739554112-wtkWb5OCzSEJp4bruSIZPCiowx7YoKyg-0-70c4be5f24369da1e4ab6f25d4fbabb5)
图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=1739554112-0jfHe8kk4fsWQdVzgDvY8EFD1WoU6Wo7-0-c63ca76854a1f001414bae52db085104)
3.1.3 纹理的填充方式
当位图被拉伸的时候,就会涉及其纹理的填充方式了。填充方式主要有两种:
● 拉伸图像以填充区域。
● 重复图像以填充区域。
下面的案例将展示图像的两种填充方式。
首先创建一个称为BitmapFillMode的项目,删除src文件夹内的所有文件,然后创建一个名为Main.ts的类文件,并对其做出如下修改,参见二维码3-3:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/62_02.jpg?sign=1739554112-ZeMJzWZZlswFFahmPU1irvbgXVZV8oKt-0-ad65599729ffe1b12c5e9db0f74d3643)
二维码3-3
运行调试播放器观看结果,如图3-5所示:
白鹭图标位图被拉伸,这是位图对象默认的填充模式。接下来对代码做出如下修改:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/62_03.jpg?sign=1739554112-t1Ft0VJDOZO6hOvJXOreCQL1GyqdAJfM-0-a1c7a4dedba4ac1177456f86ee0a57d1)
运行调试播放器观看结果,如图3-6所示:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/62_04.jpg?sign=1739554112-Ha3NiY4vYMrTdoVsTlMC42gAWpEzTgPJ-0-49c61d90745c6addb9f145d57b0acbe4)
图3-5 程序运行结果(拉伸填充方式)
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/62_05.jpg?sign=1739554112-gh0pop9LuTvptgJRwRPedHcVdwdcdK7o-0-428b74d4416893e5d283b313ed2aa699)
图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=1739554112-1wK3q9XKoPRbyb2QPJXWtJwOhTO9DzfO-0-51682fd5d3bc274e7175f18b4d48cb44)
二维码3-4
项目里还带两个资源文件:dogs.json和dogs.png。以下是dogs.json的内容,它的资源类型是sheet,参见二维码3-5:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/63_02.jpg?sign=1739554112-Mt7A6qNh5rCIWMHDXHo5oHwTDzK8bs2y-0-ef6adcaec44455d69adc115f6d2a6157)
二维码3-5
以下是dogs.png文件的内容,如图3-7所示:
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/63_03.jpg?sign=1739554112-WT1JJkdX5kJXL958QwKa2Bk0gp4ep0OK-0-fe0716f8a23982589af3b19d4657beed)
图3-7 图片的内容
运行调试播放器观看结果,如图3-8所示:
代码的关键在第18行,其中dogs_json为纹理集,dog1是纹理集的id。
![](https://epubservercos.yuewen.com/190630/23446275309889706/epubprivate/OEBPS/Images/64_01.jpg?sign=1739554112-TzsMOOOA8cXZw3tSyPIYdvcYQq3aA00e-0-2e652d461a208a0fd97271f2e73b8d9e)
图3-8 程序运行结果(纹理集)