美文网首页Egret游戏开发
egret 白鹭引擎遇到的问题和解决方案

egret 白鹭引擎遇到的问题和解决方案

作者: Zszen | 来源:发表于2018-09-06 01:02 被阅读2204次

    本文使用白鹭引擎版本是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下的图片名称/图片全地址”),但直接从左下角拖拽进去使用资源更为省心。

    我在这里遇到了两个问题:

    1. 我的资源没有任何显示,后来发现是因为资源列表窗口太小,并且当时不知道窗口可以拖动
    2. 左下角拖拽无论是图片还是纹理集都无法在测试时成功加载,总是提示是 “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。

    先写这么多,之后如果再遇到其他麻烦陆续添加

    相关文章

      网友评论

        本文标题:egret 白鹭引擎遇到的问题和解决方案

        本文链接:https://www.haomeiwen.com/subject/sictgftx.html