![了不起的LayaBox:HTML5游戏开发指南](https://wfqqreader-1252317822.image.myqcloud.com/cover/292/44819292/b_44819292.jpg)
2.3 Stage、Sprite、Graphics
在本节中,我们将创建游戏的场景并熟悉Laya.stage、Laya.Sprite及Laya.graphics的功能。这3个对象分别是LayaAir引擎中laya.display.Stage、laya.display.Sprite和laya.display.Graphics的实例,我们将逐一了解它们的功能和用途。
启动IDE,打开在2.2节创建的工程,切换到代码模式,在资源管理器中打开scr/Main.js文件,代码如下。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-42-2.jpg?sign=1738856062-JnSSQzR9yMczzG7n0RXFeTvue61TCOox-0-b0be931b216a23d1a09309d1c7578022)
我们即将创建的是一个2D项目,因此调用Main.js的第6行代码完成Laya引擎的初始化,参数设置如下。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-43-1.jpg?sign=1738856062-X5Nss760FwsZVfAovhiW6XsEYLd8Fyqc-0-ed25619462d0a94022cc4e60c2556625)
我们创建了一个宽为720像素、高为1280像素的laya.display.Stage实例。该行代码等价于:
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-43-2.jpg?sign=1738856062-PDCzaU0bILhdW1ELwAEfuMJ1jsOq4xR1-0-29dcdae8668ce6b70c0a5d2177898055)
这行代码中的第3个参数Laya.WebGL,表示该项目在运行时优先使用WebGL渲染方式。WebGL(Web Graphics Library)是一种3D绘图协议,可以为HTML5 Canvas提供硬件3D加速渲染功能,帮助Web开发人员在浏览器里借助系统显卡更流畅地展示动态图形。因为并非所有的浏览器都支持WebGL,所以,在WebGL无法正常工作的情况下,LayaAir将使用普通的渲染方式来渲染游戏。
以下两行代码用于屏幕适配,将在第4章详细介绍,在此暂不展开。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-43-3.jpg?sign=1738856062-sxtkFxLiZmUiuZqe8gaKKuWnOzH289zm-0-e614a473439d59afb5f1bcf062ceb55a)
然后,我们修改init()方法,具体如下。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-43-4.jpg?sign=1738856062-8fbmAm1Wq34DuYTZoTlmCRa6zXL5sSrb-0-8d267d6c9632b38747c32abd494749d9)
laya.display.Stage是舞台类,所有的显示对象都在舞台上显示,通过Laya.stage单例访问。Laya.stage.bgColor是Laya.stage的背景颜色属性。修改完成后,运行项目,将看到一个蓝色背景的空界面。
接下来,将IDE的调试模式设置为【Chrome调试】,运行项目,然后在Chrome浏览器被选中的状态下按【F12】快捷键,运行结果如图2.5所示。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-44-1.jpg?sign=1738856062-FFRfGQO0CYV1ugOr9bp32JDdxEpZEtN2-0-5faf6c6bf47d521334a9a91cbe88aeae)
图2.5 在Chrome浏览器中运行调试
在Chrome浏览器中保持【选择元素查看】单选按钮为选中状态,然后将光标移至屏幕左侧的空界面区域。此时,在浏览器右侧的【Elements】页面元素显示区将高亮显示一个ID为“layaCanvas”的Canvas元素,代码如下。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-44-2.jpg?sign=1738856062-AT0EETkKTMDdCTvnxbrrDLoDYav63FAz-0-4c68ad2c576a873a05cd9251368f24b8)
由此可见,Laya.stage通常工作在Canvas元素中,它与浏览器的对应层级关系,如图2.6所示。在普通的LayaBox游戏开发中,通常只考虑在Laya.stage上实现各种功能。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-44-3.jpg?sign=1738856062-g8HWEwb7Rjz8xNyBwVCSxVMX51wXr4MP-0-4cb9ff4a4c9ccf90f946cb3e929b9256)
图2.6 Stage与浏览器的层级关系
Laya.stage是单例模式的对象,在一个游戏项目中只有一个。Laya.stage也使用LayaAir引擎开发游戏的根节点,因此在开发时不建议删除Laya.stage。贸然删除Laya.stage会给重建游戏场景等操作带来很多不便,所以,通常采用在Laya.stage上加载或移除对象的方法来渲染游戏的可视化对象。
Laya.stage的坐标系原点在左上角,x轴的正方向是从左至右,y轴的正方向是从上至下。在Main.js的init()方法体(后文简称为init()方法)的最后,添加两行用于显示Laya.stage坐标的代码,具体如下。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-45-1.jpg?sign=1738856062-F9MvhFa8ZafClahNlT0H2bUDKocXTfES-0-f68ed8f4e0af3f83336867d35b6697dc)
切换到LayaAir调试模式,运行项目,在调试控制台将输出下列结果。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-45-2.jpg?sign=1738856062-QaWrX7y07IMutXlsBtzBx7pxUF7qKi5l-0-c851782c93ef997e5eefafc1c34abc2a)
注意:Laya.stage的默认位置是(0,0),通常不可以修改。
接下来,介绍Laya.Sprite。
Laya.Sprite是基本的显示图形的列表节点。Laya.Sprite默认没有宽和高,并且不接受鼠标事件。通过Graphics可以绘制图形或矢量图,支持旋转、缩放、位移等操作。Laya.Sprite也是容器类,可用来添加多个子节点。
创建一个名为“sp”的Laya.Sprite对象,代码如下。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-45-3.jpg?sign=1738856062-F97w2KrYJNGzrip304VJo0kdUsaErzbd-0-21dcc8ef4cdd1572813a017046519a79)
在init()方法中添加下列代码并运行。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-45-4.jpg?sign=1738856062-FXM2tiznr8aKpaA575YXAiqYYL8slzk4-0-63e298f60818aadd8f6049ad22e8ab21)
调试控制台的运行输出结果如下。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-45-5.jpg?sign=1738856062-fJGP6QCqSxN0se4H8R8omFnHe9x5MSFH-0-eb6634fe4fe7237d1159c7c8f82c2d2f)
但是,此时在屏幕上没有显示任何内容。这是因为创建的sp对象只是一个空节点,不包含任何可显示的元素。
下面介绍如何在Laya.stage和Sprite对象中添加可显示的内容。
Laya.Graphics是一个工具API,用于创建绘图显示对象。在Laya项目中,可视化对象的实例都自动包含Graphics的功能。例如,在init()方法的最后添加下面的代码,将在Laya.stage()中绘制两条交叉的线段。drawLine()是绘制线段的方法,前4个参数分别表示起点的横坐标、纵坐标及终点的横坐标、纵坐标,第5个参数表示线段的颜色,第6个参数表示线段的宽度。运行结果如图2.7所示。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-46-1.jpg?sign=1738856062-m0w3IYL4g7KzqSBABfNAn0qHm8JBre6N-0-f530278b7c2d1da681937c745d9de79d)
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-46-2.jpg?sign=1738856062-ZSZIDuS2fKCrLhkBMa79TbnVy1XcLoJc-0-0df071422f9d66e9c1aea42784b56e84)
图2.7 在Laya.stage中绘制两条交叉的线段
同理,可以在已经创建的Sprite对象sp中绘制图形,代码如下。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-46-3.jpg?sign=1738856062-Oi79GQO98N6il9MPwjMFnVY3CIKsGTyA-0-e1a3c689a16123c4988c67eaa286f1a6)
运行结果如图2.8所示。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-47-1.jpg?sign=1738856062-Qu9sG8Bw9qvSd0R32LB9xgG2yRvaym7t-0-da738f75fdaf6c03acb7e7ff166dc663)
图2.8 在Sprite中绘制图形
以下代码在Sprite对象的原点绘制了一个半径为40的圆。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-47-2.jpg?sign=1738856062-At8FC5oVm38rGsSWHEsKOObsoJNE3duG-0-98d625fab2a6bc960e5f19795b88c638)
drawCircle的前3个参数依次表示圆心坐标x、y及圆的半径;第4个参数表示圆的填充颜色,此处设为null(不填充);第5个参数表示边框的颜色;第6个参数表示边框的宽。
注意:第56行代码与第54行代码的运行结果在屏幕上组成了同心圆,这两个圆分别绘制在Laya.stage和sp上,因此,这两行代码的drawCircle参数的圆心坐标是不一样的。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-47-3.jpg?sign=1738856062-8UxjikSP3pgR15GaXrJ5OTfwZyFmAtoS-0-9b489d88cc83c45e72639da8d0c026fc)
Laya.Sprite是可以嵌套使用的,在指定的Sprite中,它们的子节点的Sprite位置通常是相对该Sprite的原点设置的。在init()方法的最后,可以添加下面的代码。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-47-4.jpg?sign=1738856062-WbaJfQveCkwZucudKiHMTFQ2ohBptzf3-0-885a78028907091f90c9b843d2bdf9b4)
运行结果如图2.9所示。这时,在调试控制台中会同时显示sp1相对于Laya.Stage的坐标(以下称为“全局坐标”)。sp1相对stage的坐标是(450,450)。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-48-1.jpg?sign=1738856062-zDQEFKZ3lmU77M81jXCD3Wj6IwymFmZd-0-663974ebb08e8fcf9713c7cb4c2bd35a)
图2.9 在Sprite中添加Sprite
第68行代码的作用是完成sp1相对于Laya.stage的坐标转换,并将结果存储在一个laya.maths.Point类型的对象中(该对象使用x和y两个元素保存转换结果)。
注意:使用localToGlobal方法转换容器本身的坐标时,被转换的点应该是这个容器的坐标原点。例如,将第68行代码进行如下修改,得到的转换结果将是先前设定的(400,300)。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-48-2.jpg?sign=1738856062-PWWfdrp4zCO9YwM6uzfhGO9OFqJqTLdU-0-661973435cae2ab9c280782d2b80823d)
localToGlobal是一个非常有用的方法,可以提供便捷的坐标转换。如果将sp围绕其原点转动30°,使用localToGlobal方法可以方便地得到sp1的新的全局坐标。修改init()方法,添加如下代码。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-49-1.jpg?sign=1738856062-2m9hNHt2BGuQcBehxfOlSysaVTq8c9QB-0-ac46a588ea81d00e782fdfbd12d53b62)
调试项目,将得到如图2.10所示的结果,并在调试控制台中输出。sp1相对于stage的坐标是(368.3012715727659,454.9038108507872)。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-49-2.jpg?sign=1738856062-wkA8Yoh3uZFFJg6vm4xSiO58nyySEbCV-0-5b8e1e0fa4130270f6fdeab889bdad20)
图2.10 旋转Sprite
如图2.10所示,sp与sp1的相对位置不变,但由于sp旋转了30°,导致先前绘制在Sprite上的线段发生了旋转,sp1的全局坐标就发生了改变。
Main.js中的init()方法的完整代码如下。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-50-1.jpg?sign=1738856062-kxBnEhYA1EoTdINe21JWyqCRxMWKxT0h-0-90bf03f4f8a3464c6abaaf816b0ba2ad)