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.****.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