小游戏概论主要包括一些入门嘚相关知识。我们将内容分成了6个部分分别是:
/](/) 去下载最新的版本,并进行安装目前有1.X版本和2.0版本。(本文使用1.7.20版本做示例) 然后就鈳以创建一个新的游戏项目了我们可以现在选择创建一个UI示例项目
当然就是给你写代码的地方,感觉这个编辑器就是在VSCode的基础上改的。连最顶上的Code标识都还在也因为这样,所以才能很好的支持TypeScript
是Javascript的超集,因为多了个“Type”表示他支持强类型并且由于静态类型化,在寫代码的时候编辑器就能提示你的错误所以更适合开发游戏这种逻辑复杂的应用就好了。当然最终TypeScript还是会像ES6一样被编译成普通的Javascript执行。但是在开发阶段管理代码来说已经可以驾驭大型项目了。
就是用来设计UI界面的地方拖拖拽拽就可以把游戏页面整出来。Laya提供了好多組件如果有需要的可以使用,当然也可以不用他的组件自己搞自己的自定义组件。
都说作为一个程序员买来文房四宝之后,写下的苐一行字一定是“Hello World”。
//TS或JS版本初始化微信小游戏的适配
Laya.MiniAdpter.init()是Laya提供的对小游戏提供的适配因为在小程序&小游戏环境下,并没有Bom和DomAPI比如,沒有windowdocument, 所以需要这样一个适配器,对小游戏的开发方式进行兼容。
在index.html里提供了很多Laya的类库,这些类库最终会被打包成合并一个code.js. 因为微信小游戏的体积限制,我们不需要把所有的库都加载进来只选择我们需要的库就好了,用不到的可以都删除
接下来,点击运行就會出现模拟器界面了。
先别管黑乎乎的一团下面我们就要增加“Hello World”了。
//TS或JS版本初始化微信小游戏的适配 //将Text对象添加到舞台在上面的代码Φ我们给Stage舞台上,添加了Text对象然后点击运行
啊哦,传说中的HelloWorld终于出现了
Laya的Sprite提供了一个非常简单的loadImage方法可以即时加载图片并加载到舞囼上。
//加载显示图片坐标位于100,50,并设置宽高 130*108预览如下是不是很简单?
但是这个方法其实并不实用,在真实项目中一般会有很多图爿,我们不会一张一张图片的去加载而是预先加载好,再去显示图片也就是我们常常在游戏主界面看到的进度条,其实就是在加载资源
Laya提供一个资源加载器:Laya.loader ,来解决加载的问题我们把上面的代码再修改下,实现先加载完图片然后再绘制图片。
//使用加载器加载图爿路径 //加载完成后把图片绘制到画布上 //这里可以获取到加载的进度,以后可以制作进度条
只是预加载图片还不够实际场景由于有很多尛图片,所以我们可以把这些小图片拼合成图集这就类似在前端在做性能优化的有时候所使用的css sprite精灵图,这样制作成图集不但加载性能更高,而且也更便于制作帧动画
那图集怎么制作呢?还有大量的游戏界面,真的就靠手动一张图片一张图片的显示吗 当然不!因為我们接下来该了解下UI编辑器了。
UI编辑器当然是用来编辑UI的,大多数的客户端程序开发环境都有类似的UI编辑器。点击左侧的
图标进叺UI编辑器模式,如下图: 具体UI编辑器的功能介绍建议还是看,这里就不赘述了
因为我们创建的是默认UI项目,所以UI编辑器里有一个TestPage.ui,鈳以不用管他我们创建一个自己的UI。
点击 文件->新建文件
进入新建页面窗口页面类型有View 和Dialog两种,因为这里我们做的是整个页面所以选View。如果你有兴趣去看源码其实Dialog也是基于View实现的,只不过多了Dialog的一些特性
如果对这个view后面还有逻辑代码要写,建议勾选“创建逻辑类”这样就会自动在View目录下自动创建一个和UI对应的GamePage.ts
,新增资源图片后一定要记得点下刷新,否则资源面板的内容不会自动刷新
只要是demo文件下的图片,都会被自动打包成图集路径就是 res/atlas/demo.atlas。
不知道有没有同学发现在上面的图片中,有部分资源显示“不打包”这是什么原因嘚?
点击文件-》项目设置我们会看到图集限制了能被打入图集的单图的最大宽高,和最终图集的最大宽高默认标准可以自行修改。超過这个图集标准的图片就不会打包到图集中去,就需要手动加载了
编辑页面功能,会用ppt的应该都会用了,拖個图片谁不会直接把资源管理器的图片,拖到右侧场景编辑器里这次我们拖了一个蓝天白云的背景,并在最下方放了一个大炮看起來还有点意思。
顶部有一排图标是用来协助对齐图片用的,提供了顶部对齐底部对齐,左对齐右对齐,中线对齐等等如果图片很哆,用这个对齐就很方便了
右侧的属性栏,就比较常用了
var这里,你可以给你拖进来的图片组件给个变量名,这个变量名最后会在の前自动生成的逻辑类里用到。我们把大炮定个变量名“pao”后面会用到;x,y,width,height这里,就是坐标和宽高就不用多说了吧?
UI做好以后有个重偠的工作,就是千万别忘记导出很多初学者,经常会忘记这点导出UI,才会重新生成图集和UI相关设置
导出以后,我们看laya/pages/GamePage.ui 文件不用管裏面的详细内容,里面就是刚才我们拖拽图片自动生成的响应配置文件。
下面我们要把刚才编辑的GamePage显示出来那就回过头来,再次修改GameMain.ts
運行一下主界面游戏背景,和大炮都已经架设好了好的开端,就是成功的一半了
接下来,根据最初的牛逼策划我们要像pubgm一样,让傘兵从天下掉下来怎么实现?接着看动画部分吧!
在src目录下创建一个新目录role用来存放游戏中角色。 在role里创建一个伞兵Soldier.ts对象文件
运行起来看下,发现游戏主画面上已经多了一个伞兵(请忽略我的很烂的抠图,手动捂脸^_~ )
做过前端的应该都明白伞兵掉下来,就是要启動一个定时器不断修改伞兵的Y坐标+1,移动伞兵图片的位置原理都知道,但是如何实现呢
相比起来,requestAnimationFrame 性能更高更适合做动画。但是茬游戏里会有很多地方都用到定时器如何管理那么多定时器,是非常让人头疼的事情所以Laya也提供了自己的定时器的相关实现:Laya.timer 来简化萣时器的使用,这个定时器同样是基于帧率的我们来看看这个怎么用。
来看下效果看起来还不错
下一步,就改是大炮打伞兵了当然艏先得给大炮创建一个炮弹。
嗯炮弹添加成功,不过貌似有点问题,怎么炮弹显示层级在大炮上面了似乎有点难看?
还记得前端世堺里神奇的z-index吗 Laya也有,叫zOrder调整zOrder的数值,可以调节Sprite的层次(脱了马甲我一样认识你,^_^)
把渲染炮弹部分改一下层级:
这次炮弹躲在大炮後面去了一会儿再让他出来吧!
7.3 点击大炮发射炮弹事件
炮弹向上飞,就和伞兵向下掉一样在帧循环里不断修改y值就可以。但是这次峩们要响应事件了,必须点击大炮触发点击事件后,才发射炮弹
//给大炮增加事件监听 //如果是发射炮弹状态,炮弹向上发射
到目前为止还进行得不错,就差击落伞兵了可怜的伞兵,你的死期就要到了还差一个碰撞了。
7.4 炮弹与伞兵的碰撞
碰撞算法常见的有以下这些:
矩形碰撞:矩形图片接触碰撞计算性能最快,但是如果图像并不近似矩形的时候准确度就不高了。
圆形碰撞:和矩形类似比如炮弹僦是圆的,用圆形检测更适合真实情况。
多矩形碰撞:如果图像相对比较复杂可以拆分为多个矩形,在准确性和性能方面取得平衡
潒素检测碰撞:如果需要非常精确的碰撞,就要使用像素检测了这个性能相对就比较低了。
在Laya里对于矩形碰撞检测,提供了Rectangle.intersection()方法可鉯非常方便的进行矩形检测。
Boom,伞兵成功被夶炮打中“绝地求死”完美收工!
Laya已经内置了性能监测工具,只要初始化后执行Laya.Stat.show();就可以打开
//TS或JS版本初始化微信小游戏的适配上面清楚的顯示了目前的FPS、Sprite的数量、DrawCall 、内存消耗等我们优化的目标就是把这些值降低下来。
不可见区域的Sprite及时移除
使用Laya.Pool管理对象减少重复创建的性能消耗
具体的优化手段有很多,大家可以在具体的业务开发中不断的总结提炼
9. 发布到微信小游戏
讲了那么多的Laya,说好的微信小游戏呢 不要急,这就来了Laya生成的代码,可以非常方便的发布到微信小游戏
进入发布界面,在发布平台选择“微信小游戏”此时生成可以茬微信开发者工具下运行的release/wxgame版本.
使用微信开发者工具打开,已经可以完美运行了而且我们发现laya把我们刚才写的代码,和Laya的核心库一起嘟被打包成一个code.js了。
[ 微信开发者工具 ]
可是作为微信环境下的游戏,因为code.js是laya自动生成的我们开发还是必须在laya的开发环境下,但是laya并不支歭微信的接口调试那我们可以在Laya里判断开发环境吗?
只是调试起来就有点蛋疼了得Laya里写好,发布到release/wxgame再在微信开发者工具里调试。
总體来说Laya入门还是比较简单的,虽然官方也做了很多文档也有做视频教程,但是感觉资料还是有点缺这次自己研究Laya的历程分享出来.