使用白鹭引擎遇到的一些问题以及一些工具分享

用egret也有一段时间了,记录一下遇到的bug和流水账。

BUG类

1 Uncaught SecurityError: Failed to execute ‘getImageData‘ on ‘CanvasRenderingContext2D‘: The canvas has been tainted by cross-origin data.

egret 2.5 里面将WebImageLoader的crossOrigin默认值设置为anonymous就可以了

心得:

1 关闭列表的滚动:比较hack的做法

var skin = this.list.skin;
var scroller:egret.gui.Scroller = skin._elementsContent[0];
if( scroller != null)
    scroller.verticalScrollPolicy = "off";

2 监听列表的滚动事件:

这个找了很久

this.list.dataGroup.addEventListener(egret.gui.PropertyChangeEvent.PROPERTY_CHANGE,this.onListTouchEnd, this);

private onListTouchEnd(evt:egret.gui.PropertyChangeEvent){

            var newPos:number = evt.newValue;
            var referPos:number = this.list.dataGroup.scrollRect.bottom-this.list.dataGroup.height;
            if( evt.property == "verticalScrollPosition" && referPos - newPos <= 10){
                //todo dosomething
            }
        }

工具:

1 抽屉效果

原理: Tween + mask实现

例如对显示对象d实现抽屉效果:

var tw:egret.Tween = egret.Tween.get(this.d,{onChange:this.updateMask,onChangeObj:this},null,true);
this.maskForD = new egret.Rectangle(0,0,0,60);
private updateMask(){
    var showWidth:number;
    if( this.isLeft){
        showWidth = 420-(this.itemGroup.x-20);
    }else{
        showWidth = 420 - this.itemGroup.x;
    }
    this.maskForD.width = showWidth;
    this.d.mask = this.maskForItemGroup;
}

2 帧事件的管理

沿用as的习惯,全局只有一个帧事件。

/**
 * Created by DukeCrushIt on 2015/8/5.
 */
module game {
    export class FrameMgr extends egret.HashObject {
        public constructor() {
            super();
            this.items = [];
            this.itemMap = {};
        }
        public itemMap:Object;
        private items:FrameItem[];
        private stage:egret.Stage;
        public referTime:number;
        public initStage(stage:egret.Stage){
            this.stage = stage;
            this.stage.addEventListener(egret.Event.ENTER_FRAME,this.update, this);
            this.referTime = egret.getTimer();
        }

        public update(evt:egret.Event){
            var temp:number = egret.getTimer();
            var delta:number = temp - this.referTime;
            var len:number = this.items.length;
            var item:FrameItem;
            for(var idx = len-1; idx >= 0; idx--){
                item = this.items[idx];
                item.callFun.call(item.callObj,delta);
            }
            this.referTime = temp;
            Model.SYSTIME += delta;
        }

        public addControll(item:FrameItem){
            if( this.items.indexOf(item) == -1){
                this.items.push(item);
                this.itemMap[item.callObj.name] = item;
            }
        }

        public delController(name:string){
            if( this.items.length == 0 ) return;
            var item:FrameItem = this.itemMap[name];
            if( item != null && item != undefined){
                var idx:number = this.items.indexOf(item);
                if(idx != -1){
                    this.items.splice(idx,1);
                }
            }
            delete this.itemMap[name];
        }

        public isUnderControl(name:string):boolean{
            return this.itemMap[name] != undefined && this.itemMap[name] != null;
        }

        public pause(){
            this.stage.removeEventListener(egret.Event.ENTER_FRAME,this.update, this);
        }

        public resume(){
            this.referTime = egret.getTimer();
            this.stage.addEventListener(egret.Event.ENTER_FRAME,this.update, this);
        }

        private static _instance:FrameMgr;
        public static getInstance():FrameMgr{
            if( FrameMgr._instance == null)
                FrameMgr._instance = new game.FrameMgr();
            return FrameMgr._instance;
        }
    }
}

FrameMgr

配合这个使用:

/**
 * Created by DukeCrushIt on 2015/8/5.
 */
module game {
    export class FrameItem extends egret.HashObject {
        public callObj:any;
        public callFun:Function;
        public constructor() {
            super();
        }
    }
}

FrameItem

3 简单的位移补间

用自带的Tween效率不是很好,于是自己实现了一个,如下:

/**
 * Created by DukeCrushIt on 2015/8/5.
 */
module game{
    export class MoveMgr extends egret.HashObject{
        public name:string;
        public frameItem:FrameItem;
        public constructor(){
            super();
            this.items = [];
            this.name = "movemgr";
            this.frameItem = new game.FrameItem();
            this.frameItem.callObj = this;
            this.frameItem.callFun = this.update;
            FrameMgr.getInstance().addControll(this.frameItem);
        }
        private items:MoveItem[];
        private spareTime:number = 10;
        public update(deltaTime:number){
            if( this.items.length == 0) return;
            var itemLen:number = this.items.length - 1;
            var item:MoveItem;
            var startTime = egret.getTimer();
            var gap:number;
            for(var i = itemLen; i >= 0 ; i--){
                item = this.items[i];
                item.update(deltaTime);
                gap = egret.getTimer() - startTime;
                if( gap >= this.spareTime)
                    break;
            }
        }

        public addItem(item:MoveItem){
            if( this.items.indexOf(item) == -1){
                this.items.push(item);
            }
        }

        public delItem(item:MoveItem){
            var idx:number = this.items.indexOf(item);
            if( idx != -1){
                this.items.splice(idx, 1);
            }
            MoveMgr.reclaim(item);
        }

        public removeAllHairItems(){
            var len:number = this.items.length;
            var item:MoveItem;
            var disObj:egret.DisplayObject;
            for( var idx = len - 1; idx >=0 ; idx--){
                item = this.items[idx];
                disObj = item.disObject;
                if( disObj instanceof Hair){
                    item.finish();
                }
            }
        }

        public finish(){
            var itemLen:number = this.items.length - 1;
            if( itemLen == -1 ) return;
            var item:MoveItem;
            for(var i = itemLen; i >= 0 ; i--){
                item = this.items[i];
                item.finish();
            }
        }

        private static _cache:MoveItem[]=[];
        public static reclaim(item:MoveItem){
            if( MoveMgr._cache.indexOf(item) == -1)
                MoveMgr._cache.push(item);
        }
        public static produce():MoveItem{
            if(MoveMgr._cache.length!=0)
                return MoveMgr._cache.pop();
            return new MoveItem();
        }

        private static _instance:MoveMgr;
        public static getInstance():MoveMgr{
            if( MoveMgr._instance == null)
                MoveMgr._instance = new game.MoveMgr();
            return MoveMgr._instance;
        }
    }
}

MoveMgr

需要配合这个使用:

/**
 * Created by DukeCrushIt on 2015/8/5.
 */
module game{
    export class MoveItem extends egret.HashObject{
        public disObject:egret.DisplayObject;
        private gapX:number;
        private gapY:number;
        public targetX:number;
        public targetY:number;
        public duration:number;
        public past:number;
        private roll:boolean=false;
        public callBackObj:any;
        public callBackFun:Function;
        public constructor(){
            super();
        }
        public init(disObject:egret.DisplayObject,targetX:number,targetY:number,duration:number,cbObj:any=null,cbFun:Function=null,roll:boolean=false){
            this.disObject = disObject;
            this.targetX = targetX;
            this.gapX = targetX - disObject.x;
            this.targetY = targetY;
            this.gapY = targetY - disObject.y;
            this.duration = duration;
            this.past = 0;
            this.callBackObj = cbObj;
            this.callBackFun = cbFun;
            this.roll = roll;
        }

        public update(deltaTime:number){
            this.past += deltaTime;
            if( this.past < this.duration){
                var refer:number = deltaTime/this.duration;
                this.disObject.x += this.gapX*refer;
                this.disObject.y += this.gapY*refer;
                if( this.roll){
                    this.disObject.rotation += this.gapX > 0 ? 3 : -3;
                }
            }else{
                this.disObject.x = this.targetX;
                this.disObject.y = this.targetY;
                if( this.callBackObj!= null && this.callBackObj != null)
                    this.callBackFun.call(this.callBackObj);
                MoveMgr.getInstance().delItem(this);
            }
            if( this.disObject.parent == null){
                MoveMgr.getInstance().delItem(this);
            }
        }

        public finish(){
            if(this.disObject != null){
                this.disObject.x = this.targetX;
                this.disObject.y = this.targetY;
            }
            this.roll = false;
            MoveMgr.getInstance().delItem(this);
        }
    }
}

MoveItem

4 做了一个简单的重力系统,如下:

/**
 * Created by DukeCrushIt on 2015/7/30.
 */
module dukeutil{
    export class GravitySystem extends egret.HashObject {
        public gravity:number = 0.98;
        private items:GravityItem[] = [];
        private itemMap:Object = {};
        private frameItem:game.FrameItem;
        public name:string;
        public constructor(){
            super();
            this.name = "gravitysystem";
            this.frameItem = new game.FrameItem();
            this.frameItem.callFun = this.update;
            this.frameItem.callObj = this;
            game.FrameMgr.getInstance().addControll(this.frameItem);
        }

        public addItem(item:GravityItem){
            if( this.items.indexOf(item) == -1 ){
                this.items.push(item);
                this.itemMap[item.displayObject.name] = item;
            }
        }

        public contains(name:string):boolean{
            return this.itemMap[name] != undefined;
        }
        private spareTime:number = 10;
        private update(delata:number){
            var startTime = egret.getTimer();
            var gap:number;
            var len:number = this.items.length;
            var idx:number;
            var item:GravityItem;
            var displayObject:egret.DisplayObject;
            for(idx = len-1; idx >= 0; idx--){
                item = this.items[idx];
                displayObject = item.displayObject;
                if( item.phase == 0){
                    displayObject.x+=item.currentSpeedX;
                    item.currentSpeedY += this.gravity;
                    displayObject.y += item.currentSpeedY;
                    if( item.doublePhase && displayObject.y >= item.targetY){
                            item.phase = 1;
                            item.currentSpeedX = item.currentSpeedX*0.8;
                    }else if( !item.doublePhase && (item.currentSpeedY < 1 && item.currentSpeedY > -1)){
                        delete this.itemMap[item.displayObject.name];
                        this.items.splice(idx,1);
                        if( item.overCall != null && item.overCallObj != null)
                            item.overCall.call(item.overCallObj);
                        item.reset();
                        GravitySystem.reclaim(item);
                    }
                }else{
                    item.step++;
                    item.currentSpeedX = item.currentSpeedX*0.9;
                    displayObject.x+=item.currentSpeedX;

                    //if( item.currentSpeedX > 0){
                    //    displayObject.rotation+=2;
                    //}else{
                    //    displayObject.rotation-=2;
                    //}
                    if( item.step >= 30){
                        delete this.itemMap[item.displayObject.name];
                        this.items.splice(idx,1);
                        if( item.overCall != null && item.overCallObj != null)
                            item.overCall.call(item.overCallObj);
                        item.reset();
                        GravitySystem.reclaim(item);
                    }
                }
                if( displayObject.x <= 0 || displayObject.x >= game.GameConst.StageW){
                    item.currentSpeedX = -item.currentSpeedX;
                }
                gap = egret.getTimer() - startTime;
                if( gap >= this.spareTime)
                    break;
            }
        }

        private static _itemCache:GravityItem[] = [];
        public static produce():GravityItem{
            if( GravitySystem._itemCache.length != 0)
                return GravitySystem._itemCache.pop();
            return new GravityItem();
        }
        public static reclaim(item:GravityItem){
            if( GravitySystem._itemCache.indexOf(item) == -1)
                GravitySystem._itemCache.push(item);
        }

        private static _instance:GravitySystem;
        public static getInstance():GravitySystem{
            if( GravitySystem._instance == null )
                GravitySystem._instance = new dukeutil.GravitySystem();
            return GravitySystem._instance;
        }
    }
}

GravitySystem

配合使用的类:

/**
 * Created by DukeCrushIt on 2015/7/30.
 */
module dukeutil{
    export class GravityItem extends egret.HashObject{
        public phase:number=0;//0 gravity 1 roll to
        public doublePhase:boolean = true;
        public displayObject:egret.DisplayObject;
        public targetY:number;
        public currentSpeedX:number;
        public currentSpeedY:number;
        public step:number=0;
        public overCallObj:any;
        public overCall:Function;
        public constructor(){
            super();
        }
        public reset(){
            this.phase = 0;
            this.step = 0;
            this.doublePhase = true;
            this.overCall = null;
            this.overCallObj = null;
        }
    }
}

				
时间: 2024-10-20 12:51:37

使用白鹭引擎遇到的一些问题以及一些工具分享的相关文章

Egret Engine(白鹭引擎)介绍及windows下安装

Egret Engine简要介绍----- Egret Engine(白鹭引擎)[Egret Engine官网:http://www.egret-labs.org/]是一款使用TypeScript语言构建的开源免费的移动游戏引擎.白鹭引擎的核心定位是开放,高效,优雅.通过它,你可以快速地创建HTML5类型的移动游戏,也可以将游戏项目编译输出成为目标移动平台的原生游戏应用. 提到Egret Engine(白鹭引擎)就不得不提<围住神经猫>这一火爆游戏,7月22日,一款名为<围住神经猫>

canvas和白鹭引擎中平移,旋转,缩放

canvas中的 translate() 和白鹭引擎中的 .x 或者 .y  所导致的平移效果并不是移动 目标元素,而是移动目标元素父亲所在的坐标系. 例如 bgg.translate(100,100) 所表达的含义是将父亲元素所在的坐标系 向右和向下 偏移100 px. 而设置元素大小时 context.fillRect(0, 0, 100, 100) 这里的前两个参数是 真 的 设置偏移量,表示 向右和向下 偏移100px.是设置距离父亲元素的偏移量. 设置旋转,不管是canvas还是白鹭引

简单介绍了解白鹭引擎Egret

(一)关于白鹭引擎Egret Egret引擎是一个开源免费的游戏框架,用于构建二维游戏.演示程序和其他图形界面交互应用等.Egret使用TypeScript脚本语言开发.当游戏完成最终的打包后,可以将程序转换为HTML5游戏.实现跨平台特性. Egret不仅仅是一个基于HTML5技术的游戏引擎,我们的产品线中除了Egret引擎还提供了很多辅助游戏开发的工具.准确的来说,Egret是一套游戏开发的解决方案.你可以使用Egret引擎来帮助你开发HTML5游戏,并运行在手机和PC端的浏览器中,同时也你

白鹭引擎Egret入门知识补充

<围住神经猫>的一夜蹿红,让一个h5游戏引擎也跟着火热起来了--egret. (官网传送门:http://www.egret-labs.org/) 安装和helloworld的demo官网给了很简明易懂的文档,这里就不啰嗦.不过官网给的helloworld的demo的背景图片,实在没法不让人不吐槽. 项目目录如下:需要关心的有两个文件夹:launcher.src. launcher 文件夹下面,需要关心的是 index.html文件,改文件是项目的入口.egret帮助建立的,自己可以自行修改里

白鹭引擎Egret在windows下安装

1.下载安装包 从Egret网站下载专区下载最新的Egret一键安装包(windows版本). 本向导以Egret Engine 1.7版本为例 http://www.egret-labs.org/downloads 2.引擎安装 双击下载到的EgretEngine-v1.7exe,程序将会自动解压.您可以点击"立即安装"来安装到默认位置.如果您想要自定义安装选项,可以点击右下角的自定义按钮.修改完成后点击"立即安装". 注意,如果windows弹出用户账户控制窗口

【菜鸟教程】小白接触白鹭引擎4天,成功做了一款足球小游戏

写在前面:随着越来越多的新人开始接触白鹭引擎,创作属于自己的游戏.考虑到初学者会遇到一些实际操作问题,我们近期整理推出"菜鸟"系列技术文档,以便更好的让这些开发者们快速上手,Egret大神们可以自动忽略此类内容. 本文的作者是白鹭技术支持"熊猫少女",看文的小伙伴们如果有问题可以来白鹭官方论坛与之交流. 正文如下: 在接触白鹭引擎的第四天,我摸索着用EUI做了一个小游戏.可能游戏逻辑比较简单,使用的知识点也比较基础,今天与大家分享交流,请大神勿喷,不吝指点.我的小游

白鹭引擎 5.2.7 新增自动合图插件、二进制和声音缓存方案功能

2018年8月13日,白鹭引擎发布5.2.7 版本.本次版本主要新增了两大功能:命令行增加自动合图插件TextureMergerPlugin,微信小游戏支持库增加二进制和声音缓存方案. 同时,本次版本还是对 5.2 版本的一次集中性缺陷修复,更新修复了大家反馈的涉及2D渲染- JavaScript.AssetsManager.微信小游戏支持库的数个BUG.在此,我们要再次特别感谢开发者们通过Egret社区.白鹭引擎小游戏开发微信群等渠道提交的BUG反馈. 5.2.7版本中新增的自动合图插件可以帮

应对iOS政策,白鹭引擎助力数十家团队过审 AppStore 经验分享

2019年苹果更新了对HTML5游戏的政策,要求HTML5游戏应在 Safari浏览器中展现,而不是直接打包为 ipa 发布到 AppStore 中,对此,很多 开发者给予关注,并跟我们咨询寻求帮助,解决他们在白鹭引擎开发的HTML5游戏发布到AppStore的问题. 在我们白鹭完整的开发工作流产品中,使用Egret Native就可以解决就可以解决这个问题. 在最近几个月的时间中,我们引擎团队帮助数十家开发商成功将其产品顺利通过 AppStore 新规审核,总结了一些实操经验,今天跟大家分享下

SQLite DBRecovery 恢复引擎实现微信等一些手机聊天工具删除记录的快速恢复

概述: SQLite DBRecovery 提供了对开源嵌入式数据库SQLite的数据库损毁数据恢复功能,能够快速恢复SQLite 数据库意外操作.系统故障.文件损坏以及误删除记录等原因导致的数据记录的丢失.主要根据SQLite数据库对于删除的记录并没有真正的物理删除,只是打上了删除标记的逻辑删除.因此如果及时的恢复,可以把损失降到最低.基于 SQLite DBRecovery 恢复引擎,我们做了一个小工具可以实现苹果和安卓手机的微信.短信及QQ聊天记录的数据恢复.以便验证SQLite DBRe