常见的加载外部文件时候碰到的问题

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

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


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

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()做循环判断也行,帮助上面有具体做法。[/code]

这样做起来可能会觉得有点麻烦,我只是要加载我想加载的东西,怎么还要增加一个变量?那就用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 " ) ; [ / code]

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 " ) ;

2。再说加载图片和flash影片
这部分可以用的函数有loadMovie,loadMovieNum,然后就是MovieCipLoader类。加载到影片剪辑的 SWF 文件或图像会继承该影片剪辑的位置、旋转和缩放属性,所以可以用影片剪辑的目标路径来定位加载的 SWF 文件。在这里我们把加载的MC叫做loader_mc,把被加载的MC叫做loaded_mc,当然loadMovieNum()用到的loader_mc就是_level了哦。
同前面的loadVariables和loadVariablesNum一样,loadMovie和loadMovieNum具备加载外部图象和影片的能力,而没有任何事件处理,flash无法得知外部图象和影片是否已经被加载完成,因此需要依靠onEnterFrame,setInterval等不断循环来检查,才可以确定外部图象和影片是否加载完成。
这里说一下用前两个函数时怎么判断加载完成,先说loadMovie();

var loader_mc = 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 () & amp ;& amp ; _level1 . getBytesLoaded () & gt ; 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);[/code]

关于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。

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值