• Flash AS3 解决SWF加载报错问题


    • 一个SWF加载另一个SWF时,先看下我们用的加载代码:
    • AS3代码
    1. var loadSwf:Loader = new Loader;   
    2. loadSwf.contentLoaderInfo.addEventListener(Event.COMPLETE, loadCom)   
    3. loadSwf.load(new URLRequest("demo.swf"))   
    4. private function loadCom(event:Event):void {   
    5.     var loadInfo:LoaderInfo = event.target as LoaderInfo;   
    6.     var getSwf:DisplayObject = loadInfo.content as DisplayObject;   
    7.     stage.addChild(getSwf);   
    8. }  
    • 报错情况有以下几处:
    • 1.显示对象根目录错误
    • 有 些人为图方便,直接在把Loader对象用addChild()添加到舞台上,这是错误的,因为有些子SWF的程序在文档类中,把parent看成是 stage,而直接添加Loader对象,子SWF中的parent就是Loader了,Loader相当于另一个容器,而导致子SWF执行不正常.
    • 解 决方法:看看上面的加载代码,已经是解决方法了,第六行,我们获得的getSwf其实是一个文档类的实例化,因为文档类必须继承 DisplayObject的,所以获取的类型为DisplayObject是肯定正确的.我们把文档类直接添加到stage中,这样就保证了与原SWF 的结构一致.
    • 2.加载进来提示无法访问空对象引用的属性或方法.
    • 这是因为子SWF还没有添加到舞台上就调用stage了,这时stage是null值,所以提示这个错误.
    • 解决方法:在子SWF的构造函数中,添加到舞台上再执行代码.

     

    • AS3代码
        1. public function Main(){//构造函数
        2. if (stage!=null){   
        3.          init();   
        4. }else{   
        5.         addEventListener(Event.ADDED_TO_STAGE, init);      
        6. }}   
        7. private function init(e:Event = null):void {      
        8. //你的代码在这执行      
        9. }   
        10. 注意:在加载的时候对stage的访问要慎重,在父swf调用子swf的时候子swf的stage是不能为空的,(因为子swf会指向 loader.swf 的 stage
          ,在addChild前就调用stage是不成功的)。
        11. 在 群里闪侠给的意见是:一个简单的原则:除了keyboardEvent事件等必须在stge上侦听的事件,其他的不要在stage上侦听,否则就破坏了封 装性。还有被访问的始终只有一个stage,而且是父的stage,Stage只有一个,而且无法实例化(它是是一种很奇怪的显示对象)
        12. 还有:7行为什么是Event = null?????
          因为 :有=null的时候可以直接调用这个方法,不用带参数
          没有=null的时候,必须是促发了你的event才会去调用这个方法,是按照默认的值来传递的不赋值是eventHandler(event:Event):void{}
          那又如何取到你加载的子swf里的一个影片剪辑呢?----》子swf.content["影片剪辑.name"],就OK了........
        13. //------------------------------------------------------------//
          DoraBin(49985104)  12:03:56
          问下 stage的 focus 出现的边框可以去掉不
          DoraBin(49985104)  12:04:47
          ···看到了
          闪侠(827004080)  12:04:56
          .focusRect = null 即可
            萧翎(469494622)  12:05:00
          我用一个swf来加载另一个swf时,为什么子swf中不能有访问stage出现啊

          闪侠(827004080)  12:05:07
          或者等于 new Sprite()
          闪侠(827004080)  12:05:46
            萧翎(469494622)  12:05:00
          我用一个swf来加载另一个swf时,为什么子swf中不能有访问stage出现啊

          子swf的stage指向父级的stage,并且此时没有加到stage上
          DoraBin(49985104)  12:05:50
          一位你加载进来的时候并没有把它 addChild到你的容器里面
            萧翎(469494622)  12:06:03
          有啊
          DoraBin(49985104)  12:06:21
          加载的时候 是没有的 你是后面才加的
          闪侠(827004080)  12:06:24
          解决方案 if(stage != null) 
            萧翎(469494622)  12:06:28

            萧翎(469494622)  12:06:41
          这样不对?
          闪侠(827004080)  12:06:47
          延迟处理,直到stage不是null
            萧翎(469494622)  12:07:33
          延迟处理?
            萧翎(469494622)  12:07:46
          不理解,劳驾解释下
          闪侠(827004080)  12:08:10
          ADDED_TO_STAGE即其一
          李玉彬(413424414)  12:08:55
          这样就可以了吧
          闪侠(827004080)  12:09:14
          如果无效请尝试trace(stage),仍然是null
          那么请确认编译器没有问题
            萧翎(469494622)  12:09:29
          我在试试
          李玉彬(413424414)  12:09:58
          Hali是文档类么?
          闪侠(827004080)  12:10:59
          别说stage真的是null
          如果那样,parent、this、root可能都是null
            萧翎(469494622)  12:11:04
          就是只要子swf的stge部位空就可以了吗?
          不二(474594087)  12:11:17
          什么问题?  刚来 没有见到前面的消息
          闪侠(827004080)  12:11:54
          但愿trace(stage)不是null
          不二(474594087)  12:11:50
          听起来好像是多级swf加载
          闪侠(827004080)  12:13:39
          感觉是,因为子swf会指向 loader.swf 的 stage
          老镇(48036113)  12:14:03
          他的问题出在addChild之前调用stage
          闪侠(827004080)  12:15:56
          是的,老问题了
          不二(474594087)  12:16:50
          是不是在加载子swf时候 加载完了发现子swf  的stage为空?
            萧翎(469494622)  12:22:54
          stage不是null啊
          闪侠(827004080)  12:23:15
          那就对了,应该不会有问题
            萧翎(469494622)  12:23:26
          就是因为我有stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler);这句,吧这句去了就OK了
          闪侠(827004080)  12:23:51
          ...
            萧翎(469494622)  12:24:13
          感觉好绕啊
          闪侠(827004080)  12:24:38
          你这样架构会有问题了
            萧翎(469494622)  12:24:48
          哪里的?
          阿蛋℡<sz1001@qq.com>  12:29:30
          添加到容器stage才有引用
            萧翎(469494622)  12:31:18
          只要子swf的stage不为空就可以了?我试了,成功了,呵呵,谢谢。刚才一直在迷糊,咩明白过来
          闪侠(827004080)  12:34:34
          Flash AS3 解决SWF加载报错问题 - 超级大白菜 - 菜园
          闪侠(827004080)  12:34:46
          这是你现在的架构
          菠菜(736036271)  12:35:43
          stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler)
          为什么非要侦听stage的ENTER_FRAME事件? 
          �理财冰鼠☆(249383596)  12:35:49
          图超了。100*100了都Flash AS3 解决SWF加载报错问题 - 超级大白菜 - 菜园
          闪侠(827004080)  12:36:12
          额,再小看不清的说
            萧翎(469494622)  12:37:24
          也就是说之所以出错时因为在调用时子swf文件还没有加载进来就条用了stage
            萧翎(469494622)  12:37:25

          闪侠(827004080)  12:37:30
          给一个简单的原则:
          除了 KeyboardEvent 等必须在 stage 上监听的事件
          其他的不要在 stage 上监听 ,单一职责
          闪侠(827004080)  12:37:37
          是的
            萧翎(469494622)  12:38:02
          那访问的stage是子的还是父的
            萧翎(469494622)  12:38:03

          闪侠(827004080)  12:38:13
          是父的
          闪侠(827004080)  12:38:27
          不推荐这样做,破坏了封装性
            萧翎(469494622)  12:38:36
          还是只要出现stage的话会吧是谁的stage分的很清楚的?
          闪侠(827004080)  12:39:03
          Stage只有一个,而且无法实例化
            萧翎(469494622)  12:39:10
          就是只要出现stage的话会把是谁的stage(子的或父的)分的很清楚
          闪侠(827004080)  12:39:20
          是一种很奇怪的显示对象
          闪侠(827004080)  12:39:39
          说了,Stage只会有一个
            萧翎(469494622)  12:39:49
          那像ENterFrame这样的侦听在哪
          闪侠(827004080)  12:39:52
          不管多少个swf
  • 相关阅读:
    8月6日总结
    8月4日总结
    8月3日总结
    快速幂计算题解
    7月31日总结
    7月30日总结
    关于PHP中”::”能够调用一个非静态的方法的解释
    码云 使用 svn 管理项目
    Mysql的数据类型
    thinkphp5的$this->fetch()
  • 原文地址:https://www.cnblogs.com/bluesea-flash/p/3405851.html
Copyright © 2020-2023  润新知