2014-02-24 24 views
0

我正在研究AS3中的jumpnrun游戏。一段时间以来,我的球员角色(我的“头像”)有一个问题。在测试Flash动画时,在10-8的情况下,我在游戏开始时发现运行时错误(#1009空对象引用),我不明白。问题在于游戏无法播放,因为未将头像剪辑添加到舞台,并且会为每个输入的帧生成错误消息。有什么令人困惑的是,每时每刻都工作正常,当我从flashdevelop内执行调试选项打开时,错误甚至不会发生...添加动画片段时不经常出现空对象引用错误

关于我的头像类:它是一个SWF文件我动态加载到程序中。它包含几个标记的帧,其中包含静态图形符号或动画片段动画符号(如步行和跳跃等)。同样在这些红色单标记帧的每一个中,我都有一个填充的矩形,用于碰撞处理。

现在的事情是根据闪存调试器的问题与每个帧中的碰撞盒有关:当错误发生闪光说它是空的(虽然它在那里(在FLA))和头像赢得'显示出来...正如我所说的,奇怪的是,有时它显然不是空的,游戏正常运行。 此外,我发现代码必须认为头像的时间轴上的第一个帧标签存在两次,因为通过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

您认为显示抛出错误的代码可能有用吗?你有没有尝试在IF语句中包装有问题的代码,所以它不会尝试使用null对象?这很可能是因为对象不在舞台上或其他一些常见场景,所以您看到的是预期的行为。 –

+0

添加了代码。我尝试了if语句,但它没有改变。我不确定代码是否真的是这里的问题,因为有时程序执行完美并且完全可以玩。但大多数时候它会抛出错误。我注意到的另一件事:通常mcAvatar有3个孩子(如果程序实际上工作正确追踪)。但是:在另一种情况下,没有孩子,mcAvatar不会被添加到舞台上,我得到的错误。这很奇怪,因为swf的所有帧都被正确设置了......这就是为什么我想知道闪存文件是否可能被搞乱。 – user1502804

回答

0

我们需要看你的代码。

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

您是否使用try-catch?

+0

我正在使用一个加载器头像类yep。在swf完全加载之前,玩家角色不会被添加到舞台上。 try-catch我没有用过,我不知道如何不幸。 – user1502804