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

时间:2007-07-26 11:02:50  来源:经典论坛  作者:佚名

1.写在前面

第一次写这样有点像教程的东西,希望能对大家有点帮助。帮助!呵呵~~,没帮助的快下个帮助去。
常常看到有些同学问这样的问题,为什么我loadMovie近来的图片不能按照我的代码显示它的大小啊?为什loadVariables进来的变量用在as中没有值呀?内容来自中国站长资讯网(www.chinahtml.com)为什么我加载的swf文件的比例,位置和大小不能控制呀?
笔者(汗!这个词语感觉起来太专业了。)刚研究这个的时候也困惑了好长时间。
呵呵。后来终于悟到:程序的执行是很快很快的,而加载外部的任何东西都是需要时间的,尽管有时候那时间只有一点点点点。

2。先说加载文本。

这部分可以用的函数有loadVariables,loadVariablesNum,还有就是loadVars类和XML类。至于它们的使用方法,flash自带的帮助讲的很全面很全面了,内容来自中国站长资讯网(www.chinahtml.com)我就没必要这里在帖了。想要说的是,loadVariables,loadVariablesNum只是两个加载文本的函数,他们只是具有加载外部文本的能力,而没有任何事件处理,flash无法得知外部文本文件是否已经被加载完成,因此需要依靠onEnterFrame,setInterval等不断循环事件或者函数,来检查变量是否存在,也可以用帧循环,才可以确定外部文件是否加载完成。
下面的代码没有达到想要的效果:

this.createEmptyMovieClip("mc",this.getNestHighestDepth());
mc.loadVariables("1.txt");
//loadVariablesNum("1.txt",1)将变量加载到特定级别
gotoAndStop(mc.frame);
//gotoAndPlay(_level1.frame);
//文本内容为frame=20

PS 加载出现乱码解决方法:文本另存为utf-8编码或者是在第一帧加System.useCodepage=true;至于原因,自己google吧。在这我一时也解释不清。
要实现上面想达到的跳转,可以在文本中增加一标记变量,比较下面的代码和上面的不同之处,

stop();
stop();
this.createEmptyMovieClip("mc", this.getNestHighestDepth());
mc.loadVariables("2.txt");
//loadVariablesNum("1.txt",1)将变量加载到特定级别_level
this.onEnterFrame = function() {
    if (mc.end == undefined) {
        looding.text = "加载中.....";
    } else {
        loading.text = "加载完成";
        delete this.onEnterFrame;
        gotoAndStop(mc.frame);
    }
};

//文本内容为frame=20&end=ok
//这里用setInterval()做循环判断也行,帮助上面有具体做法。

这样做起来可能会觉得有点麻烦,我只是要加载我想加载的东西,怎么还要增加一个变量?那就用loadVars类吧!“LoadVars 类在 Flash Player 6 中引入的,为与 Web 服务器交换 CGI 数据的常见任务提供一个更清晰、更面向对象的接口”,它使得加载外部文本变的更加灵活。

用loadVars类创建一个对象,使用onLoad,onData处理方法,都可以方便的达到判断加载完成的目的.而且loadVars对象还有getBytesTotal()和getBytesLoaded()方法,更加能直接明了的反应出下载的情况,在帮助里面找loadVars.呵呵。XML类也是同样道理,只是加载成功后的处理方法不同。

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,怎么会这样?我在研究的过程中也困惑了半天呢,在这里面多谢网友神仔的提示,呵呵,下面说解决过程。

文章评论

共有 位CH网友发表了评论 查看完整内容