Egret官方案例学习笔记

 

1.资源记载方式

(1)Egret引擎是2.0.5。

(2)resource/resource.json文件是:

{
    "resources": [
        {
            "name": "bgImage",
            "type": "image",
            "url": "assets/bg.jpg"
        },
        {
            "name": "egretIcon",
            "type": "image",
            "url": "assets/egret_icon.png"
        },
        {
            "name": "description",
            "type": "json",
            "url": "config/description.json"
        }
    ],
    "groups": [
        {
            "name": "demo2",
            "keys": "bgImage,egretIcon"
        }
    ]
}
View Code

(3)egretProperties.json中的文档类document_class中的Mian修改为“Demo2”.

(4)Demo2.ts类

/**
 *
 * @author 
 *
 */
class Demo2 extends egret.DisplayObjectContainer {
    //测试用的位图
    private logo: egret.Bitmap;
    public constructor() {
        super();
        this.addEventListener(egret.Event.ADDED_TO_STAGE,this.startGame,this);
    }
    //游戏启动后,会自动执行此方法
    public startGame(): void { 
        this.loadResource();
    }
    //加载所需资源
    private loadResource(): void
    {      //使用所需资源
        RES.addEventListener(RES.ResourceEvent.GROUP_COMPLETE,this.onResourceLoadComplete,this);
          //loadConfig的第二个参数用于指定资源根目录
        RES.loadConfig("resource/resource.json","resource/");
        RES.loadGroup("demo2");
    }
    //加载完毕后即可使用
    private onResourceLoadComplete(event: RES.ResourceEvent): void
    { 
        this.logo = new egret.Bitmap();//创建位图
        this.logo.touchEnabled = true;//可点击
        this.logo.width = this.logo.height = 100;//设置尺寸
        this.logo.scaleX = this.logo.scaleY = 1.5;//设置缩放
        this.logo.rotation = 45;//旋转
        this.logo.skewX = 45;//斜切
        this.logo.anchorX = 0.5;//设置中心点的位置,实现围绕中心旋转
        this.logo.texture = RES.getRes("egretIcon");//设置纹理
        this.addChild(this.logo);//添加到显示列表
        this.startAnimation();//调用运动函数
    }
    //使用Tween让位图做一些运动,并封装在一个方法内部
    private startAnimation(): void
    { 
        var tw = egret.Tween.get(this.logo);
        //Tween的执行是串行的,方法执行后,返回自身,这样4个to相连,其实就是依次执行4次to方法。
        tw.to({ x: 280,y: 0 },400).to({ x: 280,y: 300 },500).to({ x: 0,y:300},500).to({ x: 0,y: 0 },200);
        tw.call(this.startAnimation,this);//最后又调用了一次call,含义是动画完成后,调用startAnimation方法。其实就是产生循环调用的结果,动画会一直执行下去。
    }
        
    
}
View Code

 

2.普通文本

(1)Egret引擎是2.05

(2)egretProperties.json中的文档类document_class中的Mian修改为“Demo2”.

(3)Demo2.ts类 

/**
 *
 * @author 
 *
 */
class Demo2 extends egret.DisplayObjectContainer {

    public constructor() {
        super();
        this.addEventListener(egret.Event.ADDED_TO_STAGE,this.startGame,this);
    }
    //游戏启动后,会自动执行此方法。
    //Canvas有fillText和strokeText两个方法来绘制文本,Egret正式通过这个机制绘制普通文本的。
    public startGame(): void { 
        var label1 = new egret.TextField();//创建TextField实例
        label1.fontFamily = "Impact";//设置字体。
        label1.textColor = 0xffffff;//设置颜色,和Flash一样,设置16进制的数值
        label1.textAlign = "left";//设置文本对齐,可选:left,center,right
        label1.text = "English我是光头强\n 你是大熊";//用\n来换行
        label1.size = 30;//设置字号
        label1.width = 120;//如果设置宽度,则文本自动换行
        label1.strokeColor = 0xFF0000;//设置描边颜色,描边在游戏中的文字上很常见
        label1.stroke = 2;//设置描边大小
        //设置坐标
        label1.x = 120;
        label1.y = 100;
        //支持旋转和斜切
        label1.rotation = 30;
        label1.skewX = 30;
        this.addChild(label1);//添加到显示列表
    }  
}
View Code

 

3.播放音乐

(1)Egret引擎是2.05

(2)egretProperties.json中的文档类document_class中的Mian修改为“Demo2”.

(3)resource/assets中添加hongqinajin.mp3音乐文件。resource/resource.json文件是:

{
    "resources": [
        {"name":"sfx_die","type":"sound","url":"assets/hongqianjin.mp3"},
        {
            "name": "description",
            "type": "json",
            "url": "config/description.json"
        }
        
        
    ],
    "groups": [
        {
            "name": "demo2",
            "keys": "bgImage,egretIcon"
        },
        {"name":"demo6","keys":"sfx_die"}
    ]
}
View Code

(4)Demo2.ts类

/**
*
* @author 目前egret支持的音乐格式只有mp3。和图片创建一样,播放音乐也需要先加载音乐文件
* 
*
*/
class Demo2 extends egret.DisplayObjectContainer {
  
    public constructor() {
        super();
        this.addEventListener(egret.Event.ADDED_TO_STAGE,this.startGame,this);
    }
    //游戏启动后,会自动执行此方法
    public startGame(): void {
        this.loadResource();
    }
    //加载所需资源
    private loadResource(): void {      //使用所需资源
        RES.addEventListener(RES.ResourceEvent.GROUP_COMPLETE,this.onResourceLoadComplete,this);
        //loadConfig的第二个参数用于指定资源根目录
        RES.loadConfig("resource/resource.json","resource/");
        RES.loadGroup("demo6");
    }
    //加载完毕后就可以对音乐文件进行播放和停止的操作
    private onResourceLoadComplete(event: RES.ResourceEvent): void {
        var sound:egret.Sound = RES.getRes("sfx_die");//获取音乐文件        
        sound.play();//播放音乐文件
        
        //3秒后音乐播放结束
        egret.setTimeout(function() {
            sound.pause();//音乐播放结束
        },this,3000);//间隔时间为3秒针
        
    }
}
View Code

 

4.事件

(1)Egret引擎是2.05

(2)egretProperties.json中的文档类document_class中的Mian修改为“Demo2”.

(3)resource/assets中添加hongqinajin.mp3音乐文件。resource/resource.json文件是:

{
    "resources": [
        {
            "name": "bgImage",
            "type": "image",
            "url": "assets/bg.jpg"
        },
        {
            "name": "egretIcon",
            "type": "image",
            "url": "assets/egret_icon.png"
        },
        {
            "name": "description",
            "type": "json",
            "url": "config/description.json"
        }
    ],
    "groups": [
        {
            "name": "demo2",
            "keys": "bgImage,egretIcon"
        }
    ]
}
View Code

(4)Demo2.ts类

/**
*
* @author :egret采用了和Flash类似的“事件流”机制。事件的基类是Event,所有的事件类从Event扩展而来。
* Egret中的事件支持冒泡机制,在决定事件的时候决定它是否冒泡,同样也就有了target和currentTarget之分.
*
*/
class Demo2 extends egret.DisplayObjectContainer {
    
    public constructor() {
        super();
        this.addEventListener(egret.Event.ADDED_TO_STAGE,this.startGame,this);
    }
    //游戏启动后,会自动执行此方法
    public startGame(): void {
        this.loadResource();
    }
    //加载所需资源
    private loadResource(): void {      //使用所需资源
        RES.addEventListener(RES.ResourceEvent.GROUP_COMPLETE,this.onResourceLoadComplete,this);
        //loadConfig的第二个参数用于指定资源根目录
        RES.loadConfig("resource/resource.json","resource/");
        RES.loadGroup("demo2");
    }
    //加载完毕后就可以对文件操作
    //显示
    private onResourceLoadComplete(): void
    { 
        var container = new egret.DisplayObjectContainer();
        container.touchChildren = true;
        container.touchEnabled = true;//设置容器是否响应Touch交互
        var bitmap1 = new egret.Bitmap(RES.getRes("egretIcon"));
        bitmap1.name = "myBitmap";
        bitmap1.touchEnabled = true;
        container.addChild(bitmap1);
        container.name = "myContainer";
        container.x = container.y = 100;
        this.addChild(container);
     
        container.addEventListener(egret.TouchEvent.TOUCH_TAP,this.touchHandler,container);
      
    }
    //事件侦听处理
    private touchHandler(event: egret.TouchEvent): void
    { 
        console.log("dddd"+event.type);
        var msg: string = event.type;
        msg += "\n" + event.stageX + "," + event.stageY;
        msg += "\n" + event.localX+ "," + event.localY;
        msg += "\n" + event.currentTarget.name + "," + event.target.name;
        alert(msg);
       
              
        }
        
        }
View Code

 

5.进度条的加载

(1)Egret引擎是2.05

(2)resource/assets中根据resource/resource.json文件配置相关资源。resource/resource.json文件是:

{
    "groups":[
    {
        "keys":"barbright,bardark",
        "name":"preload"
    },
    {
        "keys":"x1,x10,x11,x12,x13,x14,x15,x16,x17,x18,x19,x2,x20,x21,x22,x23,x24,x25,x26,x27,x28,x29,x3,x30,x4,x5,x6,x7,x8,x9",
        "name":"x30"
    },
    {
        "keys":"",
        "name":""
    }],
    "resources":[
    {
        "name":"barbright",
        "type":"image",
        "url":"assets/barbright.png"
    },
    {
        "name":"bardark",
        "type":"image",
        "url":"assets/bardark.png"
    },
    {
        "name":"x1",
        "type":"image",
        "url":"assets/x30/x1.png"
    },
    {
        "name":"x10",
        "type":"image",
        "url":"assets/x30/x10.png"
    },
    {
        "name":"x11",
        "type":"image",
        "url":"assets/x30/x11.png"
    },
    {
        "name":"x12",
        "type":"image",
        "url":"assets/x30/x12.png"
    },
    {
        "name":"x13",
        "type":"image",
        "url":"assets/x30/x13.png"
    },
    {
        "name":"x14",
        "type":"image",
        "url":"assets/x30/x14.png"
    },
    {
        "name":"x15",
        "type":"image",
        "url":"assets/x30/x15.png"
    },
    {
        "name":"x16",
        "type":"image",
        "url":"assets/x30/x16.png"
    },
    {
        "name":"x17",
        "type":"image",
        "url":"assets/x30/x17.png"
    },
    {
        "name":"x18",
        "type":"image",
        "url":"assets/x30/x18.png"
    },
    {
        "name":"x19",
        "type":"image",
        "url":"assets/x30/x19.png"
    },
    {
        "name":"x2",
        "type":"image",
        "url":"assets/x30/x2.png"
    },
    {
        "name":"x20",
        "type":"image",
        "url":"assets/x30/x20.png"
    },
    {
        "name":"x21",
        "type":"image",
        "url":"assets/x30/x21.png"
    },
    {
        "name":"x22",
        "type":"image",
        "url":"assets/x30/x22.png"
    },
    {
        "name":"x23",
        "type":"image",
        "url":"assets/x30/x23.png"
    },
    {
        "name":"x24",
        "type":"image",
        "url":"assets/x30/x24.png"
    },
    {
        "name":"x25",
        "type":"image",
        "url":"assets/x30/x25.png"
    },
    {
        "name":"x26",
        "type":"image",
        "url":"assets/x30/x26.png"
    },
    {
        "name":"x27",
        "type":"image",
        "url":"assets/x30/x27.png"
    },
    {
        "name":"x28",
        "type":"image",
        "url":"assets/x30/x28.png"
    },
    {
        "name":"x29",
        "type":"image",
        "url":"assets/x30/x29.png"
    },
    {
        "name":"x3",
        "type":"image",
        "url":"assets/x30/x3.png"
    },
    {
        "name":"x30",
        "type":"image",
        "url":"assets/x30/x30.png"
    },
    {
        "name":"x4",
        "type":"image",
        "url":"assets/x30/x4.png"
    },
    {
        "name":"x5",
        "type":"image",
        "url":"assets/x30/x5.png"
    },
    {
        "name":"x6",
        "type":"image",
        "url":"assets/x30/x6.png"
    },
    {
        "name":"x7",
        "type":"image",
        "url":"assets/x30/x7.png"
    },
    {
        "name":"x8",
        "type":"image",
        "url":"assets/x30/x8.png"
    },
    {
        "name":"x9",
        "type":"image",
        "url":"assets/x30/x9.png"
    }]
}
View Code

(3)Main.ts

class Main extends egret.DisplayObjectContainer { 
    public constructor(){
        super();
        this.addEventListener(egret.Event.ADDED_TO_STAGE,this.onAddToStage,this);
      }
    private onAddToStage(event: egret.Event)
    { 
        //初始化Resource资源记载库
        RES.addEventListener(RES.ResourceEvent.CONFIG_COMPLETE,this.onConfigComplete,this);
        RES.loadConfig("resource/resource.json","resource/");      
    }
    //配置文件加载完成,开始预加载preload资源库
    private onConfigComplete(event: RES.ResourceEvent): void
    {
        RES.removeEventListener(RES.ResourceEvent.CONFIG_COMPLETE,this.onConfigComplete,this);
        RES.addEventListener(RES.ResourceEvent.GROUP_COMPLETE,this.createGameScene,this);
        RES.loadGroup("preload"); 
    }
     //perload 资源组加载结束,创建游戏场景
    private load: Load;
    private createGameScene(event: RES.ResourceEvent): void
    { 
        RES.removeEventListener(RES.ResourceEvent.GROUP_COMPLETE,this.createGameScene,this);
        //绘制点击的方块
        var sp: egret.Sprite= new egret.Sprite();
        sp.graphics.beginFill(0xffffff);
        sp.graphics.drawRect(0,0,100,50);
        sp.x = 10;
        sp.y = 10;
        sp.width = 100;
        sp.height = 50;
        sp.touchEnabled = true;//打开点击方块中的属性
        this.addChild(sp);
        
        //文字说明
        var txt1: egret.TextField = new egret.TextField();
        txt1.text = "点击架载第1波30个资源图片";
        txt1.x = 120,txt1.y = 10;
        this.addChild(txt1);
        
          //申请一个Load实例
        this.load = new Load();
        this.load.x = this.stage.width / 2; this.load.y = 110;
        this.addChild(this.load);
        
           //点击开始加载
        sp.addEventListener(egret.TouchEvent.TOUCH_TAP,this.startLoad,this);
    }
    private startLoad(): void
    { 
        this.load.startLoad();//记载对象load中的startLoad函数
    }
    
}
View Code

(4)Load.ts

class Load extends egret.DisplayObjectContainer
{ 
    private maskRect: egret.Rectangle;//一个九宫格
    private txt: egret.TextField;
    private bright: egret.Bitmap;
    public constructor() { 
        super();
        this.addEventListener(egret.Event.ADDED_TO_STAGE,this.onAddToStage,this);
    }
    public onAddToStage(): void
    { 
        this.x = this.stage.stageWidth / 2;//改变了这个屏幕的中心点的位置,由原来的左上角中的x改为中间点为x的起始值
        //底部的进度条
        var dark: egret.Bitmap = new egret.Bitmap(RES.getRes("bardark"));
        dark.x = -dark.width / 2;
        this.addChild(dark);
        //上面的进度条
        this.bright = new egret.Bitmap(RES.getRes("barbright"));
        this.bright.x = -this.bright.width / 2;
        this.addChild(this.bright);
        
        this.maskRect = new egret.Rectangle(0,0,0,24);//一开始的遮罩为0
        this.bright.mask = this.maskRect;
        
        //加载进度说明
        this.txt = new egret.TextField();
        this.txt.width = 400;
        this.txt.textAlign = "center";
        this.txt.text = "0/30";
        this.txt.x = -200;
        this.txt.y = -40;
        this.addChild(this.txt);
    }
    
    public startLoad(): void
    { 
        //加载载资源结束调用onLoadEnd()
        RES.addEventListener(RES.ResourceEvent.GROUP_COMPLETE,this.onLoadEnd,this);
        //加载资源的过程,调用onProgress()
        RES.addEventListener(RES.ResourceEvent.GROUP_PROGRESS,this.onProgress,this);
        RES.loadGroup("x30");//记载资源组
    }
    //记载资源文件过程中
    public onProgress(event: RES.ResourceEvent): void
    { 
        this.txt.text = event.itemsLoaded.toString() + "/" + event.itemsTotal.toString();//记载过程中的文字
        var per:number = event.itemsLoaded / event.itemsTotal;//记载的百分比。event.itemsLoaded是加载的总量。event.itemsToTal是总共要加载的总量。
        this.maskRect = new egret.Rectangle(0,0,per * 256,24);//遮罩的百分比
        this.bright.mask = this.maskRect;//九宫格赋值给bright的mask属性
    }
    //记载资源文件结束
    public onLoadEnd(): void
    { 
        this.txt.text = "30/30 记载结束";
    }
}
View Code

 

6.本地数据存储

(1)Egret引擎是2.05。

(2)Main.ts

//egret实现了本地存储的功能。存储数据需要key和value,都必须是字符串。
class Main extends egret.DisplayObjectContainer{
    
    public constructor() {
        super();
        this.createGameScene();
    }
    
    private createGameScene():void{
        //申请一个文本框
        this.txt = new egret.TextField();
        this.txt.text = "点我";
        this.addChild(this.txt);
        this.touchEnabled = true;//打开文本框的点击属性
        
        this.addEventListener(egret.TouchEvent.TOUCH_TAP,this.onSave,this);//文本框点击的蒋婷
   
    }
    
    private txt:egret.TextField
    //本案例中的key就是“pro”
    private onSave(e:egret.TouchEvent):void{
        //egret.localStorage.removeItem("pro");删除数据
        //egret.localStorage.clear();//将所有数据清空
        
        var value:string;
        //如果能读取到数据,就把数据复制给value,就在文本框txt中显示出来。如果没有读取数据,那么就是文本框就显示1.
        if(egret.localStorage.getItem("pro"))
        {
            value =egret.localStorage.getItem("pro"); //读取数据
        }else{
            value="1";
        }
        
        this.txt.text = value;
        var v2:string = (parseInt(value)+1).toString();//每次点击一次,就发生一次监听,也就相当于本函数执行一次,也就是value的值要加1。
        egret.localStorage.setItem("pro",v2);//把数组v2存储了在本地了。
    }
    
 
}
View Code

 

7.粒子系统

官方给定的粒子系统中档案非常的乱,现在进行整理如下。

(1)引擎是2.5.4。在官方中下载粒子系统的Particle。注意只需要其中只有三个文件(Particle.d.ts,particle.js,particle.min.js)。不需要其它的文件了。

(2)将上述中的三个文件放到文件夹particle中。放到项目中的libs/modules/中即可。

(3)在egretProperties.json中进行配置。在modules中添加“name”和“path”

{
    "native": {
        "path_ignore": []
    },
    "publish": {
        "web": 0,
        "native": 1,
        "path": "bin-release"
    },
    "egret_version": "2.5.4",
    "modules": [
        {
            "name": "egret"
        },
        {
            "name": "game"
        },
        {
            "name": "tween"
        },
                {
            "name": "particle",
           "path": "../libsrc"
        },

        {
            "name": "res"
        }
    
    ]
}
View Code

不过我郁闷的是path中改为:“path”:"../libs"和“path”:“../libs/modules/particle”都可以。
(4)利用EgretFeather进行制作后得到两个文件,一个是png文理和json文件。拷贝到resource/assets中去,并且在resource.json进行正确的配置,在这里我相信大家都会。这里是官方的resource.json配置。

{
"resources":
    [
        {"name":"blood","type":"image","url":"assets/particle/blood.png"},
        {"name":"star","type":"image","url":"assets/particle/star.png"},
        {"name":"energy","type":"image","url":"assets/particle/energy.png"},
        {"name":"magic","type":"image","url":"assets/particle/magic.png"},
        {"name":"fireworks_json","type":"json","url":"assets/particle/fireworks.json"},
        {"name":"fire_json","type":"json","url":"assets/particle/fire.json"},
        {"name":"sun_json","type":"json","url":"assets/particle/sun.json"},
        {"name":"jellyfish_json","type":"json","url":"assets/particle/jellyfish.json"}
    ],

"groups":
    [
        {"name":"preload","keys":"blood,star,energy,magic,fireworks_json,fire_json,sun_json,jellyfish_json"}
    ]
}
View Code

(5)到了这一步骤,配置工作都完成了,下面就是代码的运用了。
当然首先是加载资源了。

class Main extends egret.DisplayObjectContainer {

    /**
     * 加载进度界面
     */
    private loadingView:LoadingUI;

    public constructor() {
        super();
        this.addEventListener(egret.Event.ADDED_TO_STAGE, this.onAddToStage, this);
    }

    private onAddToStage(event:egret.Event) {
        //设置加载进度界面
        this.loadingView = new LoadingUI();
        this.stage.addChild(this.loadingView);

        //初始化Resource资源加载库
        RES.addEventListener(RES.ResourceEvent.CONFIG_COMPLETE, this.onConfigComplete, this);
        RES.loadConfig("resource/resource.json", "resource/");
    }

    /**
     * 配置文件加载完成,开始预加载preload资源组。
     */
    private onConfigComplete(event:RES.ResourceEvent):void {
        RES.removeEventListener(RES.ResourceEvent.CONFIG_COMPLETE, this.onConfigComplete, this);
        RES.addEventListener(RES.ResourceEvent.GROUP_COMPLETE, this.onResourceLoadComplete, this);
        RES.addEventListener(RES.ResourceEvent.GROUP_PROGRESS, this.onResourceProgress, this);
        RES.loadGroup("preload");
    }

    /**
     * preload资源组加载完成
     */
    private onResourceLoadComplete(event:RES.ResourceEvent):void {
        if (event.groupName == "preload") {
            this.stage.removeChild(this.loadingView);
            RES.removeEventListener(RES.ResourceEvent.GROUP_COMPLETE, this.onResourceLoadComplete, this);
            RES.removeEventListener(RES.ResourceEvent.GROUP_PROGRESS, this.onResourceProgress, this);
            this.createGameScene();
        }
    }

    /**
     * preload资源组加载进度
     */
    private onResourceProgress(event:RES.ResourceEvent):void {
        if (event.groupName == "preload") {
            this.loadingView.setProgress(event.itemsLoaded, event.itemsTotal);
        }
    }
//这个上面都在讲述加载资源,下面才是粒子系统运用的代码。
    
    private configList:Array<string> = ["fireworks","fire","sun","jellyfish"];//将所有运用的json文件放到一个数组中
    private configIndex:number = -1;//标志json文件是哪一个
    private textureList:Array<string> = ["blood","star","energy","magic"];//将所有的纹理放在一个数组中
    private textureIndex:number = 0;//标志纹理集是哪一个?
    private system:particle.ParticleSystem;//声明一个粒子系统system
    private btn1:egret.TextField;
    private btn2:egret.TextField;

    /**
     * 创建游戏场景
     */
    private createGameScene():void {
        
        this.stage.addEventListener(egret.TouchEvent.TOUCH_TAP, this.onClick, this);

        //设置换效果的图标
        this.btn1 = new egret.TextField();
        this.btn1.text = "换效果";
        this.addChild(this.btn1);
        this.btn1.x = 180;
        this.btn1.width = 100;
        this.btn1.height = 50;
        this.btn1.touchEnabled = true;
        this.btn1.addEventListener(egret.TouchEvent.TOUCH_TAP, this.changeEffect, this);

        //设置换换纹理的图标
        this.btn2 = new egret.TextField();
        this.btn2.text = "换纹理";
        this.addChild(this.btn2);
        this.btn2.x = 180;
        this.btn2.y = 50;
        this.btn2.width = 100;
        this.btn2.height = 50;
        this.btn2.touchEnabled = true;
        this.btn2.addEventListener(egret.TouchEvent.TOUCH_TAP, this.changeTexture, this);

        this.changeEffect();//粒子生函数。
    }

    private onClick(event):void {
        if(event.target == this.btn1 || event.target == this.btn2) {//如果点击的不是换纹理图标和换效果的图标那么就返回函数。
            return;
        }
        this.system.emitterX = event.stageX;//粒子系统的位置时点击时位置。也就是鼠标点击哪儿,哪儿生成粒子。
        this.system.emitterY = event.stageY;
    }

    private changeEffect():void {
        this.configIndex++;//默认采用fireworks.json纹理集
        if (this.configIndex >= this.configList.length) {//当configIndex大于长度时就采用fireworks.json这个纹理集
            this.configIndex = 0;
        }
        var s = this.configList[this.configIndex];//将json复制给s
        var textureS = this.textureList[this.textureIndex];//将纹理集复制给textureS
        var texture = RES.getRes(textureS);//获取纹理集
        var config = RES.getRes(s + "_json");//获取json文件。

        if (this.system) {//如果存在了粒子系统,
            this.system.stop();//粒子系统停止制造
            this.removeChild(this.system);//移除粒子系统
        }

        this.system = new particle.GravityParticleSystem(texture, config);//生成一个粒子系统
        this.addChild(this.system);//粒子系统放到舞台上,否则就不能显示
        this.system.start();//粒子系统开始启动
    }

    private changeTexture():void {//改变纹理集
        this.textureIndex++;//纹理集增加1
        if (this.textureIndex >= this.textureList.length) {//如果textureIndex数目超过其数组长度,那么就复制为0,也就是从头开始
            this.textureIndex = 0;
        }
        var s = this.textureList[this.textureIndex];//获取纹理的名字
        var texture = RES.getRes(s);//获取纹理
        this.system.changeTexture(texture);//粒子系统改变纹理。
    }
}
View Code

(6)粒子系统中一些重要属性和方法。

ParticleSystem:

(I)publc emissionTime:number=-1;粒子出现的时间,单位是毫秒,取值范围是(0,Number.MAX_VALUE],-1表示无限时间。如果你希望粒子系统之存在几秒毫秒时间,一定要设置。不然粒子系统一定都在创建。

(II)public emitterX:number=0;public emitterY:number=0;也就是粒子系统产生(出现)的位置。

 

8.callLater()方法

(1)egret.全局函数下定义

(2)public callLater(method:Function,thisObject:any,...args):void

功能:延迟函数到屏幕重绘前执行。

参数:method:Function--要延迟执行的函数

         thisObject:any---回调函数的this引用

    ...args--函数参数列表

(3)

private label: egret.TextField;
    private createScene(): void {
        //创建TextField对象
        this.label = new egret.TextField();
        //设置文本颜色
        this.label.textColor = 0xFF0000;
        //设置字号
        this.label.size = 30;
        //设置显示文本
        this.label.text = "Hello Egret";
        //添加到显示列表
        this.addChild(this.label);
        
        console.log("beforCallLater");
        //使用callLater实现延迟函数
        egret.callLater(this.onCallLater,this);
        console.log("afterCallLater");
    }
    private onCallLater(): void
    { 
        console.log("onCallLater");
        this.label.text = "callLater";
    }
View Code

(4)结果:
打印:

beforCallLater
afterCallLater
onCallLater

屏幕上显示的内容是   callLater

 

9.getDefinitionByName()方法

(1)egret.全局函数下定义

(2)public getDefinitionByName(name:string):any

功能:返回name参数指定的类的类对象引用

参数:name:string---类的名称

(3)

    private createScene(): void {
        console.log(egret.getDefinitionByName("egret.DisplayObject"));//egret.DisplayObject对象
        console.log(egret.getDefinitionByName("egret.Nothing"));//null
            
        var cls: any = egret.getDefinitionByName("egret.Shape");
        var shape: egret.Shape = new cls();
        shape.graphics.beginFill(0xff00000);
        shape.graphics.drawRect(0,0,100,100);
        shape.graphics.endFill();
        shape.x = shape.y = 100;
        this.addChild(shape);
    }
View Code

 

(4)结果

打印:

function DisplayObject() {
            _super.call(this);
            /**
             * @private
             * 能够含有子项的类将子项列表存储在这个属性里。
             */
            this.$children = null;
            /**
             * @private
             */
            this.$parent = null;
            /**
             * @private
             */
            this.$stage = null;
            /**
             * @private
             * 这个对象在显示列表中的嵌套深度,舞台为1,它的子项为2,子项的子项为3,以此类推。当对象不在显示列表中时此属性值为0.
             */
            this.$nestLevel = 0;
            /**
             * @private
             */
            this.$visible = true;
            /**
             * @private
             * cacheAsBitmap创建的缓存位图节点。
             */
            this.$displayList = null;
            /**
             * @private
             */
            this.$alpha = 1;
            this.$touchEnabled = DisplayObject.defaultTouchEnabled;
            /**
             * @private
             */
            this.$scrollRect = null;
            /**
             * @private
             */
            this.$blendMode = 0;
            /**
             * @private
             * 被遮罩的对象
             */
            this.$maskedObject = null;
            /**
             * @private
             */
            this.$mask = null;
            /**
             * @private
             */
            this.$maskRect = null;
            /**
             * @private
             */
            this.$parentDisplayList = null;
            /**
             * @private
             * 是否需要重绘的标志,此属性在渲染时会被访问,所以单独声明一个直接的变量。
             */
            this.$isDirty = false;
            /**
             * @private
             * 这个对象在舞台上的整体透明度
             */
            this.$renderAlpha = 1;
            /**
             * @private
             * 相对于显示列表根节点或位图缓存根节点上的矩阵对象
             */
            this.$renderMatrix = new egret.Matrix();
            /**
             * @private
             * 此显示对象自身(不包括子项)在显示列表根节点或位图缓存根节点上的显示尺寸。
             */
            this.$renderRegion = null;
            this.$displayFlags = 880 /* InitFlags */;
            this.$DisplayObject = {
                0: 1,
                1: 1,
                2: 0,
                3: 0,
                4: 0,
                5: "",
                6: new egret.Matrix(),
                7: new egret.Matrix(),
                8: new egret.Matrix(),
                9: new egret.Rectangle(),
                10: new egret.Rectangle(),
                11: false,
                12: 0,
                13: 0,
                14: NaN,
                15: NaN //explicitHeight,
            };
        }
null
View Code

屏幕上显示一个红色的正方形

 

10.getQualifiedClassName()方法

(1)egret.全局函数下定义

(2)public getQualifiedClassName(value:any):string

功能:返回对象的完全限定类名。

参数:value:any--需要完全限定类名称的对象,可以将任何JavaScript值传递给此方法,包括所有可用的JavaScript类型、对象实例、原始类型(如number)和类对象。

返回:包括完全限定类名称的字符串。

(3)

  private createScene(): void {
        console.log(egret.getQualifiedClassName(egret.DisplayObject));//egret.DisplayObject
        console.log(egret.getQualifiedClassName(window));//Window
    }
View Code

(4)结果:

egret.DisplayObject
Window

 

11.音频播放器

(1)Egret引擎2.5.4,新建Egret EUI项目

(2)asset中拷贝音乐,并在default.res.json中配置

(3)Main.ts

/*
* egret2.5 音频播放测试 点击播放按钮从头播发 播放状态下可以暂停和恢复播发。 循环开关开启讲循环播放。
*/

class Main extends eui.UILayer {
    protected createChildren(): void { 
        super.createChildren();
        //eui.Theme 皮肤主题
        var theme = new eui.Theme("resource/default.thm.json",this.stage);
        theme.addEventListener(egret.Event.COMPLETE,this.onLoad,this);
    }
    private onLoad() { 
        var appui = new SoundUI();
        appui.horizontalCenter = 0;
        this.addChild(appui);
    }
}
View Code

SoundUI.ts

/**
 * 播放器的UI界面,包括播放,暂停,设置音量等
 */
class SoundUI extends eui.UILayer { 
   
    private fontSize = 22;
    public constructor() { 
        super();
        //Panel类定义一个容器,该容器为其子代提供标题栏、关闭按钮、可移动区域和内容区域
        var panel = new eui.Panel();
        panel.horizontalCenter = 0;
        panel.verticalCenter = 0;
        panel.title = "播放器测试";//标题栏中显示的标题
        panel.width = 400;
        panel.height = 400;
        
        this.addChild(panel);
        
        var music = new SoundTest();
        
        //Label是可以呈现一行或多行统一格式文本的UI组件
        var volumenLabel = new eui.Label();
        volumenLabel.text = "音量";
        volumenLabel.textColor = 0x0205cc;
        volumenLabel.size = this.fontSize;
        volumenLabel.x = 5;
        volumenLabel.y = 210;
        panel.addChild(volumenLabel);
        
        //使用HSlider(水平滑块)控件,用户可通过在滑块轨道的端点之间移动滑块来选择值。
        var slider = new eui.HSlider();
        slider.maximum = 100;//最大有效值
        slider.minimum = 0;//最小有效值,规定value属性的值不能够低于的最小值
        slider.value = 80;//此范围的当前值
        slider.liveDragging = true;//如果为true,则将在沿着轨道拖动滑块时,而不是在释放滑块按钮时,提交此滑块的值
        slider.addEventListener(egret.Event.CHANGE,(e: egret.Event) => {
            console.log(slider.pendingValue);//pendingValue:触摸结束时滑块将具有的值
            music.setVolume(slider.pendingValue);
        },this);
        slider.x = 70;
        slider.y = 210;
        slider.width = 200;
        panel.addChild(slider);
        
        //toggleButton组件定义切换按钮。
        var play = new eui.ToggleButton();
        play.label = "播放";
        play.x = 50;
        play.y = 70;
        play.addEventListener(egret.Event.CHANGE,(e: egret.TouchEvent) => {
            if(play.selected) {//selected:boolean 按钮处于按下状态时为true,而按钮处于弹起状态时为false
                music.play();
            } else {
                music.stop();
            }
        },this);
        panel.addChild(play);
        
        //toggleSwitch表示一个开关组件
        var loop = new eui.ToggleSwitch();
        loop.label = "循环";
        loop.x = 150;
        loop.y = 70;
        loop.addEventListener(egret.Event.CHANGE,(e: egret.Event) => {
            if(loop.selected) {//selected:boolean 按钮处于按下状态时为true,而按钮处于弹起状态时为false
                music.setLoop(-1);
            } else {
                music.setLoop(1);
            }
        },this);
        panel.addChild(loop);
        
        var looplable = new egret.TextField();
        looplable.text = "循环";
        looplable.x = loop.x;
        looplable.y = loop.y + 27;
        looplable.size = 20;
        looplable.textColor = 0x2103cc;
        panel.addChild(looplable);
        
        var pause = new eui.Button();
        pause.label = "暂停";
        pause.x = 50;
        pause.y = 120;
        pause.addEventListener(egret.TouchEvent.TOUCH_TAP,(e: egret.TouchEvent) => {
            music.pouse();
        },this);
        panel.addChild(pause);

        var resume = new eui.Button();
        resume.label = "恢复";
        resume.x = 150;
        resume.y = 120;
        resume.addEventListener(egret.TouchEvent.TOUCH_TAP,(e: egret.TouchEvent) => {
            music.resume();
        },this);
        panel.addChild(resume);

        var timelable = new eui.Label();
        timelable.text = "播放时间: " + music.showPosition().toFixed(4);
        timelable.textColor = 0x0205cc;
        timelable.size = this.fontSize;
        timelable.x = 5;
        timelable.y = 250;
        panel.addChild(timelable);
        
        this.addEventListener(egret.Event.ENTER_FRAME,(e: egret.Event) => {
            timelable.text = "播放时间:" + music.showPosition().toFixed(4) + "s";
        },this);
        
        var inputBg = new eui.Image("resource/assets/CheckBox/checkbox_select_up.png");
        inputBg.scale9Grid = new egret.Rectangle(2,2,19,19);
        inputBg.width = 300;
        inputBg.height = 25;
        inputBg.x = 70;
        inputBg.y = 300
        panel.addChild(inputBg);
        
        //可编辑文本,用于显示、滚动、选中和编辑文本
        var inputUrl = new eui.EditableText();
        inputUrl.width = inputBg.width;
        inputUrl.height = inputBg.height;
        inputUrl.x = inputBg.x;
        inputUrl.y = 300;
        inputUrl.textColor = 0x000000;
        inputUrl.size = this.fontSize;
        inputUrl.text = "输入外部音频地址";
        panel.addChild(inputUrl);
        
        inputUrl.addEventListener(egret.FocusEvent.FOCUS_IN,(e: egret.FocusEvent) => {
            inputUrl.text = "";
        },this);
        
        var button: eui.Button = new eui.Button();
        button.label = "加载";
        button.x = 5;
        button.y = inputUrl.y;
        button.scaleX = 0.6;
        button.scaleY = 0.55;
        panel.addChild(button);
        
        button.addEventListener(egret.TouchEvent.TOUCH_TAP,(e: egret.TouchEvent) => {
            if(inputUrl.text === "先输入外部音频地址")
                waring.text = "请先输入地址后再载入";
            else
                music.setUrl(inputUrl.text);
        },this);
        music.addEventListener(egret.IOErrorEvent.IO_ERROR,(e: egret.IOErrorEvent) => {
            waring.text = e.data;
            waring.textColor = 0xcc1122;
        },this);
        
        var waring: eui.Label = new eui.Label();
        waring.text = "5";
        waring.horizontalCenter = 0;
        waring.textColor = 0x11cc22;
        waring.size = 18;
        waring.fontFamily = "KaiTi";
        waring.y = 350;
        panel.addChild(waring);
    }
   
}
View Code

SoundTest.ts

class SoundTest extends egret.Sprite {

    public constructor (url?:string) {
        
        super();
        
        if(url)
            this.soundURL = url;

        this.sound = new egret.Sound();//创建一个Sound对象
        this.loadSound();
    }

    private sound:egret.Sound; 
    
    private soundURL:string = "resource/sound/soundtest.mp3";

    private soundChannel:egret.SoundChannel;//SoundChannel类控制引用程序中的声音
    //默认播放位置,从头开始的
    private positon:number = 0;
    //默认不循环,设置为负数循环
    private loop:number = 1;
    //当前状态0位空,1位播放,2位暂停, 3表示加载完成,4表示加载失败
    private status:number = 0;
    //加载音频
    private loadSound() {
        this.sound.once(egret.Event.COMPLETE,this.loadComplete,this);
        this.sound.once(egret.IOErrorEvent.IO_ERROR,this.onLoadErr,this);
        this.sound.load(this.soundURL);//启动从指定URL加载外部音频文件的过程
    }
    //加载音频完成
    private loadComplete (e:egret.Event) {
        this.status = 3;
        var waring:string = "加载完成";
        console.log(waring);
        this.dispatchEventWith(egret.Event.COMPLETE,false,waring);
    }
    //加载音频失败
    private onLoadErr (e:egret.IOErrorEvent) {
        this.status = 4;
        var waring:string = "加载失败"+this.soundURL;
        console.log(waring);
        this.dispatchEventWith(egret.IOErrorEvent.IO_ERROR,false,waring);
    }
    //设置url并重新加载
    public setUrl(url:string) {
        this.soundURL = url;
        this.loadSound();
    }
    //设置循环
    private looped(e:egret.Event){
        this.positon = 0;
        this.status = 0;
        this.play();
    }
    //获取状态
    public getStatus() {
        return this.status;
    }
    //设置音量
    public setVolume (volume:number) {
        if(this.status === 1)
            this.soundChannel.volume = volume / 100;//volume:number  音量范围从0(静音)至1(最大量)
    }
    //显示播放时间
    public showPosition ():number {

        if(this.status === 1)
            this.positon = this.soundChannel.position;//position当播放声音时,position属性表示声音文件中当前播放的位置(以秒为单位)
        return this.positon;
    }

    public play() {
        if(this.status === 4){
            this.loadSound();
            return;
        }
        this.status = 1;
        if(this.soundChannel) this.soundChannel.stop();//stop();void 停止在该声道中播放声音
        console.log(this.positon);
        this.soundChannel = this.sound.play(this.positon,this.loop);
        console.log(this.status);
    }
    public setLoop(loop:number = 1):number{
        this.loop = loop;
        if(loop < 0){
            this.soundChannel.addEventListener(egret.Event.SOUND_COMPLETE,this.looped,this);
        } else{
            return loop;
        }
        
    }
    public pouse () {
        console.log(this.status);
        if(this.status === 1){
            this.positon = this.soundChannel.position;
            this.soundChannel.stop();
            this.status = 2;
        }
        
        return this.positon;
    }
    public resume () {
        if(this.status === 2)
          this.play();
    }
    public stop () {
        this.positon = 0;
        this.soundChannel.stop();
    }
}
View Code

 

 12.视频播放器

(1)Egret引擎2.5.4,新建Egret EUI项目

(2)确保加载地址中有视频。

(3)main.ts

class Main extends eui.UILayer { 
    protected createChildren(): void { 
        super.createChildren();
        var theme = new eui.Theme("resource/default.thm.json",this.stage);
        
        this.addChild(new VideoTest());
    }
}
View Code

VideoTest.ts

/**
 *
 * @author Video允许在应用程序中使用视频
 *
 */
class VideoTest extends egret.DisplayObjectContainer {
    private video: egret.Video;
    
    public constructor() {
        super();
        this.video = new egret.Video();
        this.video.x = 0;//视频坐标x
        this.video.y = 0;//视频坐标y
        this.video.width = 640;//视频宽
        this.video.height = 320;//视频高
        this.video.fullscreen = false;//设置是否全屏(暂不支持移动设备)
        this.video.poster = "resource/post.png";//设置loding图  poster:string  视频加载前,或者在不支持将video画canvas的设备上,想要显示的视频截图地址在
        this.video.load("http://media.w3.org/2010/05/sintel/trailer.mp4");//load(url:sting):void启动从指定URL加载外部视频文件的过程
        this.addChild(this.video);//将视频添加到舞台
        //监听视频加载完成
        this.video.once(egret.Event.COMPLETE,this.onLoad,this);
        //监听视频加载失败
        this.video.once(egret.IOErrorEvent.IO_ERROR,this.onLoadErr,this);
    }
    private onLoad(e: egret.Event) { 
        var btnPlay: eui.Button = new eui.Button();
        btnPlay.label = "播放";
        btnPlay.x = this.video.x + 20;
        btnPlay.y = this.video.y + this.video.height + 20;
        this.addChild(btnPlay);
        btnPlay.addEventListener(egret.TouchEvent.TOUCH_TAP,this.play,this);
        
        var btnPause: eui.Button = new eui.Button();
        btnPause.label = "暂停";
        btnPause.x = btnPlay.x + btnPlay.width + 20;
        btnPause.y = btnPlay.y;
        this.addChild(btnPause);
        btnPause.addEventListener(egret.TouchEvent.TOUCH_TAP,this.pause,this);
        
        var volume: eui.HSlider = new eui.HSlider();
        volume.x = btnPlay.x;
        volume.y = btnPlay.y + btnPlay.height + 20;
        this.addChild(volume);
        volume.value = 100;
        volume.maximum = 100;
        volume.minimum = 0;
        volume.width = 200;
        volume.addEventListener(egret.Event.CHANGE,this.setVoluem,this);
        
        var screenSwitcher: eui.ToggleSwitch = new eui.ToggleSwitch();
        screenSwitcher.label = "全屏";
        screenSwitcher.x = btnPause.x + btnPause.width + 20;
        screenSwitcher.y = btnPause.y;
        screenSwitcher.addEventListener(egret.Event.CHANGE,this.setFullScreen,this);
        this.addChild(screenSwitcher);
        
        var position: eui.Label = new eui.Label();
        position.x = btnPlay.x;
        position.y = volume.y + volume.height + 20;
        this.addChild(position);
        position.addEventListener(egret.Event.ENTER_FRAME,this.showPosition,this);

        var btnPrintScreen: eui.Button = new eui.Button();
        btnPrintScreen.label = "截图";
        btnPrintScreen.x = screenSwitcher.x + screenSwitcher.width + 40;
        btnPrintScreen.y = btnPlay.y;
        this.addChild(btnPrintScreen);
        btnPrintScreen.addEventListener(egret.TouchEvent.TOUCH_TAP,this.printScreen,this);       
    }
    private onLoadErr(e:egret.Event)
    { 
        console.log("video load error happend");
    }
    public play(e: egret.TouchEvent)
    {  //play(startTime:number,loop:boolean)播放该视频
        this.video.play();
    }
    public pause(e: egret.TouchEvent)
    { //pause():void 暂停播放
        this.video.pause();
    }
    public setVoluem(e: egret.TouchEvent)
    { //volume:number 音量范围从0(静音)到1(最大音量)
        this.video.volume = e.target.value / 100;
    }
    public setFullScreen(e: egret.Event)
    { //fullscreen:boolean 是否全屏播放这个视频(默认值true)
        this.video.fullscreen = e.target.selected;
        
    }
    public showPosition(e: egret.Event)
    { //position:number 当播放视频时,position属性表示视频文件中当前播放的位置(以妙为单位)
        e.target.text = "播放时间:" + this.video.position;
    }
    public printScreen(e: egret.Event) { 
        //Video中属性 bitmapData:egret.BitmapData 获取视频的bitmapData,可以将视频绘制到舞台上
        //BitmapData对象是一个包含像素数据的数组。
        var bitmapData: egret.BitmapData = this.video.bitmapData;
        bitmapData = this.video.bitmapData;
        //Bitmap类表示用于显示位图图片的显示对象。bitmapData:egret.BitmapData 被引用的BitmapData对象
        var bitmap: egret.Bitmap = new egret.Bitmap();
        bitmap.bitmapData = bitmapData;
        bitmap.x = this.video.x;
        bitmap.y = this.video.y + this.video.height + 150;
        this.addChild(bitmap);
        console.log(bitmapData);
    }
}
View Code

 

 


 

posted @ 2015-10-20 15:07  黑塞矩阵  阅读(2661)  评论(0编辑  收藏  举报