打印

[基础] flash传参问题总结

今天有人问我FLASH传参的问题,即如何用loadMovieNum调用外部SWF文件的变量,现在想借此总结下,以免哪天我失忆给忘掉了。

假设主影片想载入外部影片myswf.swf并调用其舞台的一个变量bianliang,我赋值22
顺着提问者的要求,我用
loadMovieNum("myswf.swf",5["POST"])
trace(_level5.bianliang)
结果呢,undefined

纳闷了,没道理啊,我用onEnterFrame事件输出即
_root.onEnterFrame=function(){
   trace(_level5.bianliang)
}

输出为:undefined
       22
       22
       。
        。
        。

似乎明白了一点,为什么第一次输出是undefined,而后却正常呢


初步猜测:是第一次输出时SWF文件还没有载入完毕,所以是undefined
那该如何解决呢,该如何准确调用我想要的变量呢

于是想到了用movieClipLoader的loadClip方法,监视加载进度,当onLoadInit时执行trace
代码如下:
var myML=new movieClipLoader()
myML.addListener(this)
this.onLoadInit=function(){
   trace(_level5.bianliang)
}
myML.loadClip("myswf.swf",5,"POST")



所以在此强烈建议用movieClipLoader的loadClip方法传递外部FLASH参数
也许loadmovienum可以达到同样效果,只是我没发现,有其他想法的也可以补充上来,大家共同学习!!

最后添加一个问题,也是在解决那位朋友问题中会到的一个很棘手问题,如下:影片老是冲不过第三祯,举个例子,我在第一祯写入gotoAndPlay(4),在第三祯写入trace(“3”),在第四祯写入trace(“4”),测试输出3,但我单独新建一个影片,是正常的,请问有哪些因素会导致冲不过第三祯。
说得对 要做网络上的FLASH网站 极度不赞同用loadMovieNum/loadMovie来加载SWF或者图片,由于网络延迟问题会导致很多参数变量都不能正常显示,虽然在本地测试没问题的 但是一到网络上 就会尝到苦头了,刚做FLASH站的时候为了这个差点推翻做了好几天的东西...
movieClipLoader虽然比loadMovieNum难用点 但是这是解决的网络问题的一个很好方法
另贴一个加载类供大家使用
复制内容到剪贴板
代码:
class loadImg
{
    public function loadImg(ob:MovieClip, uri:String, func:Function,loadText:TextField,loadMC:MovieClip){
        if(ob && uri) {
            var mcldr = new MovieClipLoader();
            var ldrob = new Object();
            var loadnum:Number;
            ldrob.onLoadStart = function(tmc) {
                //var loadProgress = mcldr.getProgress(tmc);
            }
            ldrob.onLoadProgress = function(tmc, loadedBytes, totalBytes) {
                loadnum=int(loadedBytes/totalBytes*100);
                if(loadText!=undefined){
                    loadText.text= "loading"+loadnum+"%"
                }
                if(loadMC!=undefined){
                    loadMC.gotoAndStop(loadnum);
                }
            }
            ldrob.onLoadComplete = function(tmc) {
                //var loadProgress = mcldr.getProgress(tmc);
            }
            ldrob.onLoadInit = function(tmc) {
                if(func && typeof func == "function") {
                    func(tmc);
                }
            }
            ldrob.onLoadError = function(tmc, errc){
            }
            mcldr.addListener(ldrob);
            mcldr.loadClip(uri, ob);
        }        
    }
}
-------------------------------使用方法
import loadImg;
new loadImg(所装载图片或者SWF的MC,所加载图片或者SWF的路径,function (ob){
                                   ob._width=50;
                                   ob._height=50;
                                   ob._x=0;
                                   ob._y=0;
                                       //这个函数为加载完毕后所做事,ob为加载进来后的图片或者SWF,可以对它设置大小等
                     },显示已加载数据百分比的TXT动态文本,100帧的加载条动画);
如果不想要文本 或者加载条,可以设置为null
------------------------------------
附上源文件一个

[ 本帖最后由 moyu0921 于 2008-5-30 22:21 编辑 ]
附件: 您所在的用户组无法下载或查看附件,您需要注册/登录后才能查看!
虽然已经是老话题了,但还是鼓励一下.
在加载外部文件时都需要在加载完毕后才可以调用.
珍惜生命,远离IT
工夫没白费,希望能引起更多人的重视
有了2楼提供的类,相信又能为更多懒人造福了
不过我想懒人应该是在懂得原理的情况下为提高效率而“懒”
所以弄通最重要
个人觉得定义类的做法很好,省去了不知多少不必要的重复

TOP

还在为头像烦恼?还在为不能关注好友动态烦忧?快来蓝色理想家园吧!
很经典的帖子啊.收藏了!!!
我的小站.
http://www.natty84.cn

TOP

回复 natty84 在 5# 的帖子

经典谈不上,只能算是个总结,我只是通过语言表达出来了而已

TOP