TypeError:加载外部SWF文件时出错#1009

时间:2014-08-29 00:32:07

标签: actionscript-3 flash

我在使用AS3.0的Flash Player中制作3D文件查看器 我从Away3D示例文件中找到了AWD Viewer。 (http://awaytools.com/awaybuilder/tutorial-01/AwayBuilderTutorial01_SampleFiles.zip

它工作正常。

我将它加载到我的'Main'swf文件中。但它不起作用。它一直向我显示错误。

错误信息在

之下
TypeError: Error #1009: Cannot access a property or method of a null object reference.
    at AWDViewer/initEngine()[C:\Users\wintec\Desktop\Flash3DViewer\source\AWDViewer.as:74]
    at AWDViewer/init()[C:\Users\wintec\Desktop\Flash3DViewer\source\AWDViewer.as:57]
    at AWDViewer()[C:\Users\wintec\Desktop\Flash3DViewer\source\AWDViewer.as:49]

并且该错误行就是这个

line 74 : stage.scaleMode = StageScaleMode.NO_SCALE;
line 57 : initEngine();
line 49 : init();

我知道错误消息意味着没有名称的属性。 我查了一下,没有错。 另外,当我在'Main'swf中加载另一个swf文件时,这是有效的。奇怪的...

我不明白为什么会出现这种错误。 请帮帮我。

代码下面的

来自Main.as

package
{
    import flash.display.MovieClip;
    import flash.display.DisplayObject;
    import flash.display.Loader;
    import flash.net.URLRequest;
    import flash.events.Event;

    public class Flash3DViewer extends MovieClip
    {
        private var _request:URLRequest = new URLRequest("AWDViewer.swf"); 
        private var _loader:Loader = new Loader() 

        public function Flash3DViewer()
        {
            init();
        }
        private function init():void
        {
            stop();
            _loader.load(_request);
            _loader.contentLoaderInfo.addEventListener(Event.COMPLETE, initLoaded);
        }
        private function initLoaded():void
        {
            _loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, initLoaded);
            var extSwf = _loader.content as MovieClip;
            swfContainer.addChild(extSwf);
            trace("contents loaded");
        }
    }
}

2 个答案:

答案 0 :(得分:0)

该错误意味着您正在尝试访问尚未实例化的内容。当您不确定究竟是什么时,您应该放置一些断点并在调试模式下运行您的应用程序。

在您的情况下,该阶段很可能为空。将此显示对象添加到舞台时,DisplayObject的舞台属性设置为应用程序舞台的实例。但是,此显示对象的所有父项也应添加到舞台中。因此,在加载AWDViewer之前,请确保Flash3DViewer的实例具有阶段。

答案 1 :(得分:0)

我根据您通过DropBox提供的代码发现了您的应用程序的问题。正如我所怀疑的那样,在对象添加到阶段之前,stage属性被引用,这就是生成空引用错误的原因。

AWDViewer类在调用stage函数时从其中一个函数调用init属性过早。我已使用Flash3DViewer.as事件的正确用法更新了AWDViewer.asADDED_TO_STAGE文件,因此不会发生这种情况。我还在代码中添加了注释,供您跟进。此外,我必须修改init类中的AWDViewer函数以获取类型为Event的参数,以说明在ADDED_TO_STAGE时调用该函数的事实事件火灾。

<强> Flash3DViewer.as:

package
{
    import flash.display.MovieClip;
    import flash.display.Sprite;
    import flash.display.DisplayObject;
    import flash.display.Loader;
    import flash.net.URLRequest;
    import flash.events.Event;

    public class Flash3DViewer extends MovieClip
    {
        private var loader:Loader;

        public function Flash3DViewer():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }

        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            loadSWF("AWDViewer.swf");
        }
        private function loadSWF(url:String):void
        {
            var urlRequest:URLRequest = new URLRequest(url);
            loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaded, false, 0, true);
            loader.load(urlRequest);
            addChild(loader);
        }
        private function onLoaded(e:Event):void
        {
            var target:AWDViewer = e.currentTarget.loader.content as AWDViewer;
            trace(target);
            //target.init();   // no longer need to call the init function manually as the AWDViewer calls it when it 'knows' it has been added to the stage.  This line can be deleted.
            addChild(target);
        }
    }
}

<强> AWDViewer.as:

    public function AWDViewer()
    {
        /* Used ADDED_TO_STAGE event to know when to trigger the init 
           function call to avoid the null reference errors when accessing 
           the 'stage' property */
        addEventListener(Event.ADDED_TO_STAGE,init);

        // init();  // no longer need to manually call the init function as the ADDED_TO_STAGE event listener will take care of this.  This line can be deleted.
    }

    /**
     * Global initialise function
     */
    public function init(e:Event):void
    {
        initEngine();
        initListeners();

        AssetLibrary.enableParser(AWD2Parser);

        //kickoff asset loading
        var loader:Loader3D = new Loader3D();
        loader.load(new URLRequest("assets/monkey.awd"));

        _view.scene.addChild(loader);
    }

虽然我确实尝试编译上面的代码,并且使用我更正的代码停止生成空引用错误,但由于我们的计算机配置不同,我的计算机上出现了一些编译器错误。您只需要确保这些编译器错误不会出现在您的计算机上。

Warning: Library path "C:\Users\wintec\Desktop\3D_VR\source\libs" does not resolve to a valid directory.
Warning: Library path "$(FlexSDK)/frameworks/libs/flex.swc" does not resolve to a valid file.

如果您有任何其他问题,请告诉我。

干杯。