本文使用白鹭引擎版本是5.2.7 当前时间最新版 (截图时又出现了一版,迭代速度还是很快的)
1. 选择游戏开发模版
一定要选择ui模版,而不要选择game面板
game模版删去了theme和eui部分组件,如果你想自定义ui,还需要手动创建一个default.thm.json文件,挺麻烦的,因为他有自己专有格式,所以请尽量选择ui开发,一样可以开发游戏
game模版不包括红线范围内的文件
2. Main.ts 代码删除要小心
ui项目 Main基于 eui.UILayer
game项目 Main基于 egret.DisplayObjectContainer
两个的区别在于game项目使用事件侦听来监控场景加载到舞台上
this.once(egret.Event.ADDED_TO_STAGE, this.onAddToStage, this);
而ui项目使用createChildren函数
3. 心跳
不可删,非内存回收,是用于在后台时对内核更新暂停。
egret.lifecycle.addLifecycleListener((context) => {
// custom lifecycle plugin
})
egret.lifecycle.onPause = () => {
egret.ticker.pause();
}
egret.lifecycle.onResume = () => {
egret.ticker.resume();
}
4. 资源映射
不可删除,用于default.res.json中字符串与文件路径间的映射关系
let assetAdapter = new AssetAdapter();
egret.registerImplementation("eui.IAssetAdapter", assetAdapter);
egret.registerImplementation("eui.IThemeAdapter", new ThemeAdapter());
删除这三句将无法使用eui和exml功能,打乱exml加载时序等诸多问题。笔者误删导致麻烦还真不少。
5. async和 await
成对出现,用于异步加载并入同步队列中,让需要事件判断的api变为顺序加载的api,也就是加载成功/失败后才会继续执行之后的语句。
6. 创建eui 和创建 exml
首先egret wing开发程序是有界面编辑器的,一脸懵逼的我找了半天,发现新建exml就是界面编辑器,而直接创建eui时可以包含exml,而且这样做可以不设置eui的skinName,因为创建的时候,他们之间已经在default.thm.json中相互关联了, 之后创建这个类,就会自动加载其对应的exml皮肤。
7. exml 使用图片和json打包图问题
exml界面编辑是可以使用json打包图片和散图的,方法是从左下角的资源目录查找,此资源目录列表来源于default.res.json内的preload内容(默认main是加载preload的),有需要用到的资源需要在这里配置。另外,图片等的资源可以手动写(source = “preload下的图片名称/图片全地址”),但直接从左下角拖拽进去使用资源更为省心。
我在这里遇到了两个问题:
- 我的资源没有任何显示,后来发现是因为资源列表窗口太小,并且当时不知道窗口可以拖动
- 左下角拖拽无论是图片还是纹理集都无法在测试时成功加载,总是提示是 “ip地址+纹理名称” 找不到链接的问题,其实是上面第四大点提到的资源映射代码让我删掉了导致的。。。。。
我最初的解决方案很蠢,纹理无法正常加载,就直接把图片的实际资源地址手写到source里面,虽然能正常显示,但是治标不治本。
8. 资源id的调用
在之前代码误删导致的问题中,这里也体现出来,partAdded在childrenCreated之后加载,导致无法正常处理内部对象。(内部对象直接在eui界面类创建对象id名对应的变量,在之后可以直接调用)
这里我在错乱的逻辑中继续错乱,在eui界面类中加入了个timer用于延迟侦听partAdded完全加载完毕的完成事件,表面上看起来和正常逻辑代码跑到childrenCreated是一样的。但是这种方法治标不治本,还是需要将第四大点修复,才能有效解决这个时序问题。
9. 显示位置出错
创建很多displaycontainer+bitmap对象后会导致无法正常显示,或者影响其他代码对象显示错乱问题
这时候我将大量创建显示对象的函数放到场景创建的最后一环进行,暂时避免了这个问题。
10. eui类库和egret类库关系
egret类库是白鹭最基本的类库,eui是衔接了exml组件皮肤封装的显示类egret扩展。eui所有对象都可以被addChild。
11. Tween的问题
在测试过程中,egret虽然可以通过心跳暂停刷新,但是貌似某些情况下Tween内部还是在跑动,导致恢复时tween动画会跳到一个奇怪的地方。
也许和测试环境有关系,在电脑端呈现的错误在手机端未复现
12. 事件和Tween叠加使用。
当在事件内部使用Tween并调用call来响应完成事件时,事件evt传递参数并不能一直驻留在内存里,当call执行时,evt已经被回收了。如果想有效的使用evt的内容,将evt的内容通过call的第三个参数方式传递给call,evt本身不可以传递进去,因为事件完成轮询后会强制回收evt。
先写这么多,之后如果再遇到其他麻烦陆续添加