zoukankan      html  css  js  c++  java
  • egret 白鹭引擎遇到的问题和解决方案

    本文使用白鹭引擎版本是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。

    转发于:https://www.jianshu.com/p/4ca22d734831

  • 相关阅读:
    三大主流负载均衡软件对比(LVS+Nginx+HAproxy)
    nginx 提示the "ssl" directive is deprecated, use the "listen ... ssl" directive instead
    centos安装nginx并配置SSL证书
    hadoop创建目录文件失败
    The server time zone value 'EDT' is unrecognized or represents more than one time zone.
    脚本启动SpringBoot(jar)
    centos做免密登录
    数据库远程连接配置
    Bash 快捷键
    TCP三次握手四次断开
  • 原文地址:https://www.cnblogs.com/dt1991/p/11642741.html
Copyright © 2011-2022 走看看