我正在研究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;
}
您认为显示抛出错误的代码可能有用吗?你有没有尝试在IF语句中包装有问题的代码,所以它不会尝试使用null对象?这很可能是因为对象不在舞台上或其他一些常见场景,所以您看到的是预期的行为。 –
添加了代码。我尝试了if语句,但它没有改变。我不确定代码是否真的是这里的问题,因为有时程序执行完美并且完全可以玩。但大多数时候它会抛出错误。我注意到的另一件事:通常mcAvatar有3个孩子(如果程序实际上工作正确追踪)。但是:在另一种情况下,没有孩子,mcAvatar不会被添加到舞台上,我得到的错误。这很奇怪,因为swf的所有帧都被正确设置了......这就是为什么我想知道闪存文件是否可能被搞乱。 – user1502804