egret 小知识点汇总

新手入门参考教程(https://zhuanlan.zhihu.com/p/33686439)

1. egret.getTimer()  记录启动egret框架以来经过的毫秒数

2. 如何配置RES资源组 (添加组后将左边的资源拖拽过去就可以了)

 

1 RES.addEventListener(RES.ResourceEvent.GROUP_COMPLETE, this.onResourceLoadComplete, this);
2 RES.addEventListener(RES.ResourceEvent.GROUP_LOAD_ERROR, this.onResourceLoadError, this);
3 RES.addEventListener(RES.ResourceEvent.GROUP_PROGRESS, this.onResourceProgress, this);

event.groupName, event.itemsLoaded, event.itemsTotal 分别是组的名称,已经加载了多少和这个组总共有多少资源

3. this.stage.stageWidth, this.stage.stageHeight 在所有其他继承类(egret.Sprite, eui.Group等)中都可以获取得到,因为所有的显示对象都继承自DisplayObjectContainer => DisplayObject;

4. 自定义事件

// event<string>, bubble<boolean>, data<any>
this.dispatchEventWith( event, bubble, data );

this.dispatchEventWith( GameEvents.EVT_LOAD_PAGE, false, this._pageFocused );

this._homeUI.addEventListener( GameEvents.EVT_LOAD_PAGE, ( evt:egret.Event )=>{
    console.log( "EVT_LOAD_PAGE:", evt.data );
    this.loadPage( evt.data );
}, this );

5. 数组定义 dsListHeros:Array<Object> 或者 dsListHeros:Object[]

6. 发布微信小游戏只支持5.1.x以后的引擎版本

7. exml深层级的嵌套,单纯采用控件是不能够满足的,此时我们可以在“源码”修改相应的布局,修改完后,并不能在“属性面板”那里体现出来,因为识别不了

8. this.listHeros.dataProvider = new eui.ArrayCollection( dsListHeros ); //dataProvider:eui.ICollection

9. RES资源版本控制借鉴思考https://blog.csdn.net/sujun10/article/details/77231215

10. RES.loadGroup中使用await和不使用的区别

1 await RES.loadGroup("preload", 0, loadingView);
2 //await的话,不会触发‘GROUP_COMPLETE’事件,把await去掉则能触发事件
3 RES.addEventListener(RES.ResourceEvent.GROUP_COMPLETE, this.onResourceLoadComplete, this);

11. 缓动对象的缓动变化事件

var funcChange = function():void{
            
    if(this.y === 650 ){
        console.log( this.y);//这里的this为topMask
    }
}
var tw = egret.Tween.get( topMask, { loop: true, onChange:funcChange, onChangeObj:topMask } );

tw.to( {y:650}, 10000 , egret.Ease.backInOut);

12. 资源获取

① 使用XMLHttpRequest

② 使用白鹭API

RES.getResByUrl(url,function(data:string):void
{
    console.log(data);
},this,RES.ResourceItem.TYPE_TEXT);
//处理返回json格式的结果
RES.getResByUrl(url,function(data:Object):void
{
    console.log(data);
},this,RES.ResourceItem.TYPE_JSON);

//使用白鹭的HttpRequest
var httpRequest:egret.HttpRequest = new egret.HttpRequest();
httpRequest.responseType = egret.HttpResponseType.TEXT;
//解决跨域问题添加的请求头
httpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
httpRequest.addEventListener(egret.Event.COMPLETE,function(evt:egret.Event):void
{
     var data:string = httpRequest.response;
     console.log(data);
},this);
httpRequest.open("http://192.168.0.166:8080/game/cmgeLogin",egret.HttpMethod.POST);
httpRequest.send();

③ 使用egret.URLLoader

//demo 其中部分变量为作者本身的配置项
class DataTableManager {
    public static SERVER_DATA_GET:string = "server_data_get";
    public static STATIC_TABLE_DATA_END: string = "static_table_data_end";

    public static isLoad: boolean = false;

    //所有静态表初始化
    public static init() {
        this.isLoad = false;

        //改成加载json文件的方式
        function complete(event: egret.Event) {
            var loader: egret.URLLoader = <egret.URLLoader>event.target;

            DataTableManager.setData(JSON.parse(loader.data));
        }

        function error(event: egret.Event): void {
            alert("静态json文件加载错误");
        }

        //创建 URLLoader 对象
        var loader: egret.URLLoader = new egret.URLLoader();
        //设置加载方式为文本
        loader.dataFormat = egret.URLLoaderDataFormat.TEXT;
        //添加加载完成侦听
        loader.addEventListener(egret.Event.COMPLETE,complete,this);
        loader.addEventListener(egret.IOErrorEvent.IO_ERROR,error,this);
        var request: egret.URLRequest = new egret.URLRequest(GameConfig.RESOURCE_PATH + GameConfig.STATIC_TABLE_DATA_URL + "?v=" + GameConfig.VERSION);
        //开始加载
        loader.load(request);
    }

    /**接收所有静态表数据*/
    private static setData(data: any) {
        PetTableData.setData(data["fb_game_dog_pet"]);
        PayTableData.setData(data["pay_table"]);
        this.isLoad = true;
        EventManager.dispatchEvent(DataTableManager.STATIC_TABLE_DATA_END,true);
    }

}

13 游戏虚拟摇杆 http://bbs.egret.com/thread-28113-1-1.html

14 Texture Merger 制作字体纹理和动画

① 制作字体纹理(参照官网)

注意点:虽然是以键值对的形式引用的,但是键只允许是长度为1的字符,且如果出现同名,会被覆盖,可通过scaleX和scaleY来控制字体的大小

letterSpacing来控制字体间距;

② 制作动画(参照官网)

注意点:导出的动画可以是多个gif的合成,通过不同的名字从而调用就可以了

module Componment {
    export class Dog extends egret.MovieClip {
        public dogMovie: egret.MovieClipDataFactory
        constructor() {
            super();
            this.dogMovie = new egret.MovieClipDataFactory(RES.getRes("gqdog_json"), RES.getRes("gqdog_png"));
            
            this.movieClipData = this.dogMovie.generateMovieClipData("website")
            this.play(-1);
            this.touchEnabled = true;
            this.addEventListener(egret.TouchEvent.TOUCH_TAP, () => {
                this.movieClipData = this.dogMovie.generateMovieClipData("twoMore")
                this.play(-1)
            },this)
            //可以添加帧事件  
            this.addEventListener(egret.MovieClipEvent.FRAME_LABEL,(e:egret.MovieClipEvent)=>{
                 console.log(e,e.frameLabel,this.currentFrame);
             },this);
        }
    }
}

15 循环播放tween动画,说官方没解决?先放着先

//循环播放EGRET TWEEN动画
export function playAnimation(target: egret.tween.TweenGroup, isLoop: boolean): void {
    if (isLoop) {
        for (var key in target.items) {
            target.items[key].props = { loop: true };
        }
    }
    target.play();
}

16 this.stage.stageHeight报错,如果找不到原因,可以尝试使用egret.MainContext.instance.stage.stageWidth来解决

17 #00FFFFFF 设置填充颜色为透明

18 对于切换到后台的操作可以在钩子函数里面调用

egret.lifecycle.onPause = () => {
    egret.ticker.pause();//退出
}

egret.lifecycle.onResume = () => {
    egret.ticker.resume();//进来
}

19 egret.MainContext.deviceType == egret.MainContext.DEVICE_MOBILE类似这样的判断来检测是手机还是pc端

20 The cross-origin image错误的问题解决方案 (main.ts里面加上一句代码即可:egret.ImageLoader.crossOrigin = "anonymous";)

21 

原文地址:https://www.cnblogs.com/luguiqing/p/9361085.html