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

posted on 2013-11-04 09:22  风中雨2013  阅读(1127)  评论(0编辑  收藏  举报

导航