| 网站首页 | 文章中心 | 电子书下载 | 矢量图库 | 在线视频教程 | 素材下载 | 程序代码下载 | 视频教程下载 | JS代码 | 论坛 | 
龙腾教程网  
常用软件类:
|杀毒安全 |联络聊天 |网络软件 |多媒体类 |系统工具 |图形图像 |系统工具 |应用软件 |行业软件
开发设计类:
|动画制作 |图像处理 |3D设计 |操作系统 |站长学院 |网络相关 |WEB设计 |数据库类 |程序开发
 
  您当前位置:您现在的位置: 龙腾软件教程网 >> 文章中心 >> 动画制作 >> flash >> FLASH技巧 >> 文章正文 
 
Flash加载外部文件的常见问题解决
作者:未知 文章来源:网络

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,怎么会这样?我在研究的过程中也困惑了半天呢,在这里面多谢网友神仔的提示,呵呵,下面说解决过程。
在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的时候,内容来自中国站长资讯网(www.chinahtml.com)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。


上一篇:
  • 上一篇文章:
  • 下一篇
  • 下一篇文章: 没有了
  • 收藏此文到百度搜藏 百度搜藏| 新浪VIvi| 365key| Younote| 博采中心| 你好BLOG| 亿友网摘| 和讯网摘|
    相关文章    
    Flash制作人物头像和眨眼动画
    Flash AS2代码实现拖动和碰撞侦测
    flash手绘忧郁的卡通小女孩
    flash制作植物生成效果动画
    FLASH手绘人物侧面肖像图
    FLASH打造卡通青蛙人
    Flash绘制漂亮美女矢量图
    Flash手绘动漫帅哥头像技巧
    Flash制作晃动的烛光
    FLASH设计中秋节卡通贺卡
     
     
     
    最新文章
    普通文章 Flash加载外部文件的常见问题解决最新文章
    普通文章 Photoshop打造奥运中国动画图片最新文章
    普通文章 利用VB制作简单的图片浏览软件最新文章
    普通文章 freebsd 7.0系统光盘安装过程图解最新文章
    普通文章 图解设置两个路由器互相连接上网最新文章
    普通文章 设置连接cisco路由器地控制端口的最新文章
    普通文章 Illustrator绘制球型立体按钮最新文章
    普通文章 Photoshop制作圆球状玻璃效果图标最新文章
    普通文章 Photoshop打造美女梦之森林最新文章
    普通文章 Oracle数据库自动启动和关闭的方最新文章
     
    热门文章
  • 没有推荐文章
  •  
     
    设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 

    版权所有2006-2008 龙腾教程网