精彩专题推荐:建站之入门课 建站之必修课 建站之关键课 网站价值所在 流量提高专题 css+div 标准 个人网站打造全过程
返回建站学首页
导航:
建站首页 | 网站设计 | 网站开发 | 网站运营 | 网页软件 | 建站指南 | 搜索优化 | 图像处理 | 视频教程 | 书籍教程 | 建站专题
当前位置:首页>网页软件>FLASH教程>正文

Flash制作中常见的加载外部文件时候碰到的问题


来源:网络 时间:07-07-25 点击: 点击这里收藏本文

System.useCodepage = true;
var my_lv = new LoadVars();
my_lv.onLoad = function(success) {
    if (success) {
        trace("loaded!");
    } else {
        trace("loading");
    }
};
my_lv.load("1.txt");

loadVars也可以加载xml文件,它能把xml文件中的全部内容做为字符串输出。

System.useCodepage = true;
var my_lv = new LoadVars();
my_lv.onData = function(src) {
    if (src == undefined) {
        trace("loading...");
    } else {
        a_txt.text = src;
    }
};
my_lv.load("a.xml");

3。再说加载图片和flash影片

这部分可以用的函数有loadMovie,loadMovieNum,然后就是MovieCipLoader类。加载到影片剪辑的 SWF 文件或图像会继承该影片剪辑的位置、旋转和缩放属性,所以可以用影片剪辑的目标路径来定位加载的 SWF 文件。在这里我们把加载的MC叫做loader_mc,把被加载的MC叫做loaded_mc,当然loadMovieNum()用到的loader_mc就是_level了哦。

同前面的loadVariables和loadVariablesNum一样,loadMovie和loadMovieNum具备加载外部图象和影片的能力,而没有任何事件处理,flash无法得知外部图象和影片是否已经被加载完成,因此需要依靠onEnterFrame,setInterval等不断循环来检查,才可以确定外部图象和影片是否加载完成。
这里说一下用前两个函数时怎么判断加载完成,先说loadMovie();

this.createEmptyMovieClip("loader_mc", this.getNextHighestDepth());
loader_mc.loadMovie("1001.jpg");
this.onEnterFrame = function() {
    if (loader_mc.getBytesLoaded() == loader_mc.getBytesTotal()) {
        loader_mc._width = 200;
        loader_mc._height = 200;
        delete this.onEnterFrame;
    }
};

呵呵。上面的代码貌似能做到调整长和宽的效果,测试就会发现场景中一片空白,在if语句里面trace(loader_mc._width )输出为0,怎么会这样?我在研究的过程中也困惑了半天呢,在这里面多谢网友神仔的提示,呵呵,下面说解决过程。

在onEnterFrame刚开始执行的瞬间,loader_mc.getBytesLoaded()和loader_mc.getBytesTotal()的输出都为0,0==0当然为true,所以上面的delete this.onEnterFrame在开始就执行了。也就是说上面的代码相当于

this.createEmptyMovieClip("loader_mc", this.getNextHighestDepth());
loader_mc.loadMovie("1001.jpg");
loader_mc._width = 200;
loader_mc._height = 200;

具体原因见最后说明,这里面有几种解决方法:

1。用loader_mc.getBytesLoaded() / loader_mc.getBytesTotal()==1来判断。由数学上的"0/任何不为0的数==0",flash中trace(0/0)输出为false,这样也就间接判断了loader_mc.getBytesTotal()是不是为0,避免了0==0的问题。

2。我们也可以直接增加一个loader_mc.getBytesLoaded()大于0的判断条件。使用if (loader_mc.getBytesLoaded() == loader_mc.getBytesTotal()&&(loader_mc.getBytesLoaded()>0)来作用判断条件。

再说loadMovieNum(),这个函数是把图片或者是swf文件加载到_level上,也就是场景中,所以这个过程的loader_mc就是_level了。呵呵。解释一下_level,加载到 Flash Player 中的每个 SWF 文件都被分配一个级别。同一级别中只能存在一个swf,加载两个swf到一个级别,后者会覆盖前者。

/*
loadMovieNum("1001.jpg", 1);
_level1._width = 200;
_level1._height = 300;
//这样是不行的。
*/
loadMovieNum("1001.jpg", 1);
this.onEnterFrame = function() {
    if (_level1.getBytesLoaded() == _level1.getBytesTotal()&&_level1.getBytesLoaded()>0) {
        _level1._x=_level1._y=50;
        _level1._width = 200;
        _level1._height = 300;
                               delete this.onEnterFrame;
    }
};

然后说flash MX 2004开始有的MovieClipLoader类,在说MovieClipLoader 之前,我们得先知道侦听器。侦听器是侦听事件的对象,当我们触发某一个事件的时候,该事件就被侦听器所侦听到,然后,该事件就由侦听器的方法来处理,当然,在MovieClipLoader侦听器对象中,已经提前写入处理事件的方法。这里写一个简单的例子:

this.createEmptyMovieClip("loader_mc", 1);
var mclListener:Object = new Object();
mclListener.onLoadInit = function(target_mc:MovieClip) {
    with (target_mc) {
        _x = _y=20;
        _width = _height=300;
    }
};
var mcl:MovieClipLoader = new MovieClipLoader();
mcl.addListener(mclListener);
mcl.loadClip("1001.jpg",loader_mc);
//加载swf用mcl.loadClip("a.swf",loader_mc);

关于MovieClipLoader类的用法的学习,可以去看看awflasher的原创-完美的loading-吐血整理!aw的语言表达能力和flash水平远强于我,呵呵。我就不这里多说了,相信有了帮助和aw的教程,你很快就能掌握这个类的用法。

最后,只要你到这里的时候你明白了下面的解释我就算成功了。哈~~。加载外部文本,变量,图像或者是swf的时候,flash需要建立一个新的对象,有时候是创建一个新的来替代前面的,有的是新建一个对象,无论何种情况,都会导致程序的延迟,也就是不能马上生成这样的一个对象。代码的是从上到下顺序执行,一帧上的代码只能顺序执行一次,所以只有让它循环执行一下,才有时间判断加载的完成。简单的像这样

loader_mc.loadMovie("1001.jpg");
trace(loader_mc._width);//这时候输出的一定是加载前的loader_mc 的宽

,可以知道trace()执行的时候这样一个对象还没有创建成功,也就是还没有得到要加载的MC或者图片的属性。所以这时执行loader_mc._width=300;loader_mc._height=400;是没有意义的。同样加载变量也是同样道理。

最后,想要说的是,加载文本推荐用loadVars类,加载图像或者是swf推荐用MovieClipLoader。

9 7 3 1 2 4 8 :

  把此文章收藏到:          
广而告之
文章搜索
  • Google JZxue.Com

关于我们 | 联系我们 | 友情链接 | 网站地图
Copyright © 2005 - 2006 建站学 All rights reserved.