我在使用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文件时,这是有效的。奇怪的...
我不明白为什么会出现这种错误。 请帮帮我。
代码下面的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");
}
}
}
答案 0 :(得分:0)
该错误意味着您正在尝试访问尚未实例化的内容。当您不确定究竟是什么时,您应该放置一些断点并在调试模式下运行您的应用程序。
在您的情况下,该阶段很可能为空。将此显示对象添加到舞台时,DisplayObject的舞台属性设置为应用程序舞台的实例。但是,此显示对象的所有父项也应添加到舞台中。因此,在加载AWDViewer之前,请确保Flash3DViewer的实例具有阶段。
答案 1 :(得分:0)
我根据您通过DropBox提供的代码发现了您的应用程序的问题。正如我所怀疑的那样,在对象添加到阶段之前,stage
属性被引用,这就是生成空引用错误的原因。
AWDViewer
类在调用stage
函数时从其中一个函数调用init
属性过早。我已使用Flash3DViewer.as
事件的正确用法更新了AWDViewer.as
和ADDED_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.
如果您有任何其他问题,请告诉我。
干杯。