我正在AS3上进行一次跳跃游戏。一段时间以来,我的玩家角色(我的“头像”)存在问题。在测试flash影片时,在10到7个案例中,我在游戏开始时遇到运行时错误(#1009空对象引用),我不明白。问题是游戏不能播放,因为没有将头像剪辑添加到舞台,并且为每个输入的帧产生错误消息。令人困惑的是,偶尔一切都运行良好,当我从flashdevelop内部执行并打开调试选项时,错误甚至根本不会发生......
关于我的头像类:它是我动态加载到程序中的swf文件。它由几个带标签的框架组成,这些框架包含静态图形符号或动画片段动画符号(如步行和跳跃等)。同样在这些单个红色标记帧中的每一个中,我都有一个填充矩形,我用它来进行碰撞处理。
现在根据flash调试器的问题,问题与每一帧中的碰撞盒有关:当错误发生时,flash说它为空(虽然它在那里(在FLA中))并且化身不会出现......正如我所说,奇怪的是,有时它显然不是空的,游戏运作正常。
另外我发现代码必须认为avatar的时间轴上的第一个framelabel存在两次,因为通过this.totalFrames
的迭代会返回第一帧的名称两次。
是否有可能发生奇怪的事情并且程序试图进入一个不存在的框架,因此没有一个collbox?我不懂。我真的希望任何人都可以理解它。我只是想知道如何摆脱这个空引用错误。任何帮助将不胜感激!
这是我在调试模式下的输出:
Attempting to launch and connect to Player using URL C:\...\game\Main.swf
[SWF] C:\...\game\Main.swf - 1244185 bytes after decompression
[SWF] C:\...\game\Avatar.swf - 20657 bytes after decompression
[SWF] C:\...\game\LevelOne.swf - 72447 bytes after decompression
[UnloadSWF] C:\...\game\Avatar.swf
TypeError: Error #1009: Der Zugriff auf eine Eigenschaft oder eine Methode eines null-Objektverweises ist nicht möglich.
at Avatar/updatePosition()
at Avatar/eFrame()
编辑:
抱歉,我没有早点回来。我的代码:
public function Avatar():void
{
this.x = 100;
this.y = 750;
this.gotoAndStop(0);
var i:int;
var obj:DisplayObject;
for ( i = 0; i < this.numChildren; i++ )
{
obj = this.getChildAt(i);
if ( obj is AvatarCollbox )
{
obj.visible = false;
}
}
this.gotoAndStop( "avatarIdle" );
addEventListener( Event.ENTER_FRAME, eFrame );
}
function eFrame( e:Event ):void
{
updatePosition();
}
function updatePosition():void
{
var mcCollbox:DisplayObject;
for ( var i:int = 0; i < this.numChildren; i++ )
{
var obj:DisplayObject = this.getChildAt( i );
if ( obj is AvatarCollbox )
{
mcCollbox = obj;
break;
}
}
var collisionTolerance:int = 5;
// this line causes the error: mcCollbox is said to be null (which can't be since
// I put the collbox-mc in EVERY frame of Avatar.swf's timeline...)
var rectBoundsAvatar:Rectangle = mcCollbox.getBounds( mcCollbox );
var iAvatarOldLeft:int = iOldPositionX + rectBoundsAvatar.left + collisionTolerance;
var iAvatarOldRight:int = iOldPositionX + rectBoundsAvatar.right - collisionTolerance;
var iAvatarOldTop:int = iOldPositionY + rectBoundsAvatar.top + collisionTolerance;
var iAvatarOldBottom:int = iOldPositionY + rectBoundsAvatar.bottom - collisionTolerance;
var iAvatarNewLeft:int = iNewPositionX + rectBoundsAvatar.left;
var iAvatarNewRight:int = iNewPositionX + rectBoundsAvatar.right;
var iAvatarNewTop:int = iNewPositionY + rectBoundsAvatar.top;
var iAvatarNewBottom:int = iNewPositionY + rectBoundsAvatar.bottom;
}
答案 0 :(得分:0)
我们需要密切关注您的代码。
您使用的是loaderOfYuurAvantarSWFFile.addEventListener(Event.COMPLETE,init); ??
您使用的是try-catch吗?