![了不起的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=1738937770-1BvzUQzqpbkIG04RZMLWHaCqBTV5nLG9-0-6646cca921b2e31ace94cc4f9f0a6985)
我们即将创建的是一个2D项目,因此调用Main.js的第6行代码完成Laya引擎的初始化,参数设置如下。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-43-1.jpg?sign=1738937770-smVOg1wv7ibVzdmKKXfKiTzwpRhTELNx-0-2b9932f6b9b7f70b451391eb1abfa152)
我们创建了一个宽为720像素、高为1280像素的laya.display.Stage实例。该行代码等价于:
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-43-2.jpg?sign=1738937770-ckRSlorb4GOBeqvzsgAQb51arzRu3yMt-0-78d15225457750755cf6367064e7d8a6)
这行代码中的第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=1738937770-3Z9rV4HLyVuDREYMegtu30eb7JQHM587-0-213524af08c9b38d2b42a2b02934209e)
然后,我们修改init()方法,具体如下。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-43-4.jpg?sign=1738937770-J7oWg1LqGVWqKTpkh5TJTjQgyyBO4NHN-0-62e91de317e9ae2df6639143b1afc1a3)
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=1738937770-bHu42TiVkRqbMNBwjVEcDQ29XOHLYIm0-0-0c0baf4096d964fdbdd9ae14b8f1e2ee)
图2.5 在Chrome浏览器中运行调试
在Chrome浏览器中保持【选择元素查看】单选按钮为选中状态,然后将光标移至屏幕左侧的空界面区域。此时,在浏览器右侧的【Elements】页面元素显示区将高亮显示一个ID为“layaCanvas”的Canvas元素,代码如下。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-44-2.jpg?sign=1738937770-f4oUM77KyxY26VRDa0oKZVfu5HTCy0pK-0-1e7992a1894c964160baa1056e81cdc9)
由此可见,Laya.stage通常工作在Canvas元素中,它与浏览器的对应层级关系,如图2.6所示。在普通的LayaBox游戏开发中,通常只考虑在Laya.stage上实现各种功能。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-44-3.jpg?sign=1738937770-c08SIawStOyLBKcFPRbjaBAQ9h1TPvPN-0-79a568ba2f03065ed84357282eb6b362)
图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=1738937770-QWqpc5OX7aYTUTUmL4mVjSVwoO8S5dIk-0-9c0de24651750ef122f12846d7c23c5b)
切换到LayaAir调试模式,运行项目,在调试控制台将输出下列结果。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-45-2.jpg?sign=1738937770-OXmPzOb9BVpdGnw2Y1y3DeLIPDTKuLT7-0-46a8af2c68cabb85df826c1048d3b2a8)
注意: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=1738937770-zEI4o1kicZIG7NIU1kLhZivALMuRo7Uy-0-be6638f780074755f3afa67f3c5c036a)
在init()方法中添加下列代码并运行。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-45-4.jpg?sign=1738937770-hYj50lqiwVSMH2EuMLx2dj5yYlmKB7Gk-0-01496808bd3d1421ee5726d8d0990fea)
调试控制台的运行输出结果如下。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-45-5.jpg?sign=1738937770-s0BVvYDNz7vOPL7I3LyhTkTAXbE4eAsy-0-22cbeddbd71c4e7e9802ec966b57cc1a)
但是,此时在屏幕上没有显示任何内容。这是因为创建的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=1738937770-8xQCvnH2uUWPD33jDmC14xDcaNj7nBVK-0-432138ad8621f5cb04795b7dc5b35cfc)
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-46-2.jpg?sign=1738937770-wfBfu7N7fOSqqsgWRYlwSUoTa3uWJuFW-0-305401d3ec47fcd6533c147217e17b10)
图2.7 在Laya.stage中绘制两条交叉的线段
同理,可以在已经创建的Sprite对象sp中绘制图形,代码如下。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-46-3.jpg?sign=1738937770-PG4qm5KuEsSWsXp2etDTAjD6b1M5DW5A-0-07b278fb1f276b5c3fcdb61537787f3b)
运行结果如图2.8所示。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-47-1.jpg?sign=1738937770-hap86aThTZe4bD1OdObT6IBrkRD166Yg-0-32a93f6c5cd9e937fab85fefb490584e)
图2.8 在Sprite中绘制图形
以下代码在Sprite对象的原点绘制了一个半径为40的圆。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-47-2.jpg?sign=1738937770-X5DbtLKWm6urrL0cHpKWt0tp2lRLPFok-0-e77be141954d7670d02baa9184e80018)
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=1738937770-G4yi0UgJcQ7qHDO4QdQAeDKooyfOlxpN-0-a99986c14d56bd70aa754be961358bd5)
Laya.Sprite是可以嵌套使用的,在指定的Sprite中,它们的子节点的Sprite位置通常是相对该Sprite的原点设置的。在init()方法的最后,可以添加下面的代码。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-47-4.jpg?sign=1738937770-c8wt3Yow1ize0n5sqqSYWN6tIYHAoG2z-0-72558900f41b67ca7f542396126e29d5)
运行结果如图2.9所示。这时,在调试控制台中会同时显示sp1相对于Laya.Stage的坐标(以下称为“全局坐标”)。sp1相对stage的坐标是(450,450)。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-48-1.jpg?sign=1738937770-QYgEJKTMpKCq6Cgcjr18YmSX2qvYp8t3-0-fb08ce86aa7b7ca3597190c7b4f2d1b9)
图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=1738937770-bEcC66NwJonXb7y4sO2KSvcXPjjMLbBW-0-96fa88ccc800787aa19a0adf6d42ad89)
localToGlobal是一个非常有用的方法,可以提供便捷的坐标转换。如果将sp围绕其原点转动30°,使用localToGlobal方法可以方便地得到sp1的新的全局坐标。修改init()方法,添加如下代码。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-49-1.jpg?sign=1738937770-aJQ4nzder2uDj2ncAy1YJiAWAqp6BjhC-0-b2e767494c3858fa1075c5220d26d51b)
调试项目,将得到如图2.10所示的结果,并在调试控制台中输出。sp1相对于stage的坐标是(368.3012715727659,454.9038108507872)。
![](https://epubservercos.yuewen.com/80E8CD/23950038601095306/epubprivate/OEBPS/Images/42492-00-49-2.jpg?sign=1738937770-iQEPG9QxDDPAadlL87hZdZQl1qh4ihQZ-0-d19054a280670a80eca302ee5ee17ed6)
图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=1738937770-WfUkmJEPcsI4ddp4SOlYBX9dhcPJPkD7-0-abc4cf40ebb57be9560052ad5afbc3e4)