我正在研究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