Link

首页

Tweet

书单

about me

Command

Category

Egret中MovieClip的高级用法


说是高级教程,标题有点大。因为在新版本的MovieClip架构中,我们开放了所有数据接口,开发者的灵活都非常高。你可以使用MovieClip做很多事情。

这篇来讲两个问题,第一个是动态切换MovieClipData数据,另外一个是介绍一下MovieClipFactory中的缓存控制问题。

动态切换MovieClipData数据 在上一篇文章《全新的MovieClip架构设计——Egret》中,我为大家介绍了全新的MovieClip用法,和它的架构设计。 对于MovieClip而言,它仅仅控制影片剪辑的行为,而数据则有MovieClipData来保管。在MovieClip运行过程中,我们可以直接切换MovieClipData。

我们来看一个Demo,在Flash中制作两个影片剪辑,并导出一套数据。这里需要简单解释一下,在一个MovieClip的配置数据中,可以包含多个Mc数据,导出的图与Json数据如下。

newmc

{
"mc": {
    "cmc": {
        "frameRate":24,
        "labels": [
        ],
        "frames": [
            {"res":"cmc0000","x":0,"y":0},
            {"res":"cmc0001","x":0,"y":0},
            {"res":"cmc0002","x":0,"y":0},
            {"res":"cmc0003","x":0,"y":0},
            {"res":"cmc0004","x":0,"y":0}
        ]
    },
    "mcdemo": {
        "frameRate":24,
        "labels": [
        ],
        "frames": [
            {"res":"mcdemo0000","x":0,"y":0},
            {"res":"mcdemo0001","x":0,"y":0},
            {"res":"mcdemo0002","x":0,"y":0},
            {"res":"mcdemo0003","x":0,"y":0},
            {"res":"mcdemo0004","x":0,"y":0}
        ]
    }
},
"res": {
    "cmc0000":{"x":0,"y":0,"w":100,"h":100},
    "cmc0001":{"x":100,"y":0,"w":100,"h":100},
    "cmc0002":{"x":0,"y":100,"w":100,"h":100},
    "cmc0003":{"x":100,"y":100,"w":100,"h":100},
    "cmc0004":{"x":0,"y":200,"w":100,"h":100},
    "mcdemo0000":{"x":100,"y":200,"w":100,"h":100},
    "mcdemo0001":{"x":0,"y":300,"w":100,"h":100},
    "mcdemo0002":{"x":100,"y":300,"w":100,"h":100},
    "mcdemo0003":{"x":0,"y":400,"w":100,"h":100},
    "mcdemo0004":{"x":100,"y":400,"w":100,"h":100}
}
}
然后我们来看一下代码。
private textContainer: egret.Sprite;

private mc:egret.MovieClip; private mcf:egret.MovieClipDataFactory; private createGameScene(): void { var data = RES.getRes("mcdemo_json"); var tex = RES.getRes("mcdemo_png"); this.mcf = new egret.MovieClipDataFactory(data,tex); this.mc = new egret.MovieClip( this.mcf.generateMovieClipData("mcdemo")); this.addChild(this.mc); this.mc.play(1); this.mc.addEventListener(egret.Event.COMPLETE,this.completemc,this); }

private completemc(evt:egret.Event):void { this.mc.movieClipData = this.mcf.generateMovieClipData("cmc"); this.mc.play(1); }

上面这段代码运行后,会现播放一个动画,当动画播放完成后,会切换到第二个MC数据上,然后进行播放。代码和原理都非常简单。相信大家一定可以搞明白。

MovieClipFactory的enableCache属性非常的神奇。那么缓存到底在哪里产生?

当一个json数据被传递到MovieClipFactory中,它并不会被立刻解析,只有当你调用generateMovieClipData方法的时候,MovieClipFactory才会在这个json数据中去寻找你制定的mc数据。如果一个数据中存在多个mc,那么每一次调用generateMovieClipData都会进行一次查找。如果mc数据量偏大的话,此时查抄会变得缓慢。为此,在MovieClipFactory中会存在一个缓存。当进行一次查找后,会将查找的结果放置于缓存制作。待下次使用的时候,直接取出。如果你关闭了缓存开关,则每一次调用generateMovieClipData都会重新执行一次全局查找。

当开启缓存后,导致的结果将是内存会出现增长。所以开发游戏过程中,需要根据实际情况而选择性开关此功能。