![了不起的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=1738981840-WUIJCLKrEIRPe87KtIa2lZvwr07SDlrh-0-09fae19f4b3f4689f473ae99ca36fc56)
我们即将创建的是一个2D项目,因此调用Main.js的第6行代码完成Laya引擎的初始化,参数设置如下。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-43-1.jpg?sign=1738981840-LMjZKAfajVNvRWWM3ZtU97a97vgZ5oU6-0-60ca203c2a6318fac3475dfd5507dce6)
我们创建了一个宽为720像素、高为1280像素的laya.display.Stage实例。该行代码等价于:
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-43-2.jpg?sign=1738981840-Hbb49J2rRmeXiv6PY9SLGzNxLCbUcYrl-0-2a9a218d744b7ca56e05715b91c3237e)
这行代码中的第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=1738981840-qHMP5lHVlf4tEQElT8lsxI1dZnq949BZ-0-4500716378d57d607d9f789b14dd1d87)
然后,我们修改init()方法,具体如下。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-43-4.jpg?sign=1738981840-NTlcxybXqp9HmFIKn6twMD5ovoep9yya-0-4feebc90af1d1b00db2705b1daa2cd8f)
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=1738981840-5FNtdWkUMB8WIl3Ql5HYgaUZUJ19IvIJ-0-c8bc80920fd77edd17e5c425c28be933)
图2.5 在Chrome浏览器中运行调试
在Chrome浏览器中保持【选择元素查看】单选按钮为选中状态,然后将光标移至屏幕左侧的空界面区域。此时,在浏览器右侧的【Elements】页面元素显示区将高亮显示一个ID为“layaCanvas”的Canvas元素,代码如下。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-44-2.jpg?sign=1738981840-i5ad5u5OKU0DrYKzHbMKmtwWtVmidc3n-0-ac30321d97c61412af10fc8b8f88aea4)
由此可见,Laya.stage通常工作在Canvas元素中,它与浏览器的对应层级关系,如图2.6所示。在普通的LayaBox游戏开发中,通常只考虑在Laya.stage上实现各种功能。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-44-3.jpg?sign=1738981840-PFPjdVYBLknFXeJqSBf2nL5kOaDTKyIm-0-f0cee089afed4abeb5bbc58bc90dad72)
图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=1738981840-kCjLMhOQUyrPydykqo8djeNgw0GKwAIY-0-a0dd438743bb16cdda7a8aa9e93436bd)
切换到LayaAir调试模式,运行项目,在调试控制台将输出下列结果。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-45-2.jpg?sign=1738981840-DQxS63LeAGKk43sdZ7BYEBye2qYogSx1-0-bb768d48db59bd859fe23dc3a223138f)
注意: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=1738981840-zYu6JRfbBeu5n3skXlEb9Jw2Kuu2fScl-0-0f272aac044fbc2084b774df00f523c8)
在init()方法中添加下列代码并运行。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-45-4.jpg?sign=1738981840-wIacFWNMduNh1fDaxdMj6XQxdap5xfsm-0-cc40efac065d814aaa13d96d81eab5c4)
调试控制台的运行输出结果如下。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-45-5.jpg?sign=1738981840-rmzGaFzNpoWpMAlYrr7atPTWG4FU6SsY-0-eb0650524680a1543dc4e9b404d8062f)
但是,此时在屏幕上没有显示任何内容。这是因为创建的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=1738981840-ArVBNgyEQbxdJ4icNgpxgFsKHV31ETDu-0-4ba0961a70691c308a8b37c78bca8b8b)
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-46-2.jpg?sign=1738981840-Uro6RZyYZ2ERsedOpvFhkTRJ7KkrBKZM-0-f20d45c01140ed59fcef0f16b491b516)
图2.7 在Laya.stage中绘制两条交叉的线段
同理,可以在已经创建的Sprite对象sp中绘制图形,代码如下。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-46-3.jpg?sign=1738981840-3wKsy9LNu1ZuWsMQidqccG0JJJKcoznd-0-029c21af229725082d21594d5ba1004e)
运行结果如图2.8所示。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-47-1.jpg?sign=1738981840-aJmuQrcqH6B6MKEMYXmWX4YlF3mHHq8d-0-048b12e2677a9e9eb61aefb193698766)
图2.8 在Sprite中绘制图形
以下代码在Sprite对象的原点绘制了一个半径为40的圆。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-47-2.jpg?sign=1738981840-jekZg52YiilHQX1RMIWDUtrFbdaNWqXQ-0-64aa3e7de6050d2067db665fd0646e46)
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=1738981840-35KYn4EUEa1glI9prACwysGSHKQYB5Fg-0-82acc23bb0fa8928a391b445dcec3062)
Laya.Sprite是可以嵌套使用的,在指定的Sprite中,它们的子节点的Sprite位置通常是相对该Sprite的原点设置的。在init()方法的最后,可以添加下面的代码。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-47-4.jpg?sign=1738981840-OgBkvEOJ4UznMsvQzTQatfAWPGP4kGjZ-0-bd018cd4c0b8e94687056e7737d639a9)
运行结果如图2.9所示。这时,在调试控制台中会同时显示sp1相对于Laya.Stage的坐标(以下称为“全局坐标”)。sp1相对stage的坐标是(450,450)。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-48-1.jpg?sign=1738981840-ZRz6ADjkQzOTYacMKFqgZXp2etnzz7DJ-0-b437bf440fddec2a6a52899a09a76884)
图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=1738981840-uMRyjJKe1kHdC9c9YZ1xZAKh2k9Axnjm-0-559fe42bb145037d98da4a70b864b83f)
localToGlobal是一个非常有用的方法,可以提供便捷的坐标转换。如果将sp围绕其原点转动30°,使用localToGlobal方法可以方便地得到sp1的新的全局坐标。修改init()方法,添加如下代码。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-49-1.jpg?sign=1738981840-eBd7bpZ7FMD62zimz77AR576ECKM9w06-0-34d91ddbb1ba15ae35196f38010e4cd6)
调试项目,将得到如图2.10所示的结果,并在调试控制台中输出。sp1相对于stage的坐标是(368.3012715727659,454.9038108507872)。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-49-2.jpg?sign=1738981840-DSLXKELBJvH0c9GGQIgwYW1ZP8LXisf3-0-f2412024c43201996f612a9ba2504f4a)
图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=1738981840-2jw0YB7RciV11qMJNLJepPjmq2DHks78-0-339e1d9c6dcf9fd7ee20b0f4bde6e174)