添加动画片段时不经常出现的空对象引用错误

时间:2014-02-24 19:42:09

标签: actionscript-3 flash

我正在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;
}

1 个答案:

答案 0 :(得分:0)

我们需要密切关注您的代码。

您使用的是loaderOfYuurAvantarSWFFile.addEventListener(Event.COMPLETE,init); ??

您使用的是try-catch吗?