2011-03-26 115 views
0

對於我在Flash中的第一個項目,我決定製作一個小型足球比賽。每當我確定每個單獨的對象時它都在工作,但是因爲我想添加更多的小AI玩家,所以我嘗試使運動與包含對象的一些陣列一起工作,但是隨後它返回了此錯誤消息。任何幫助?ActionScript 3.0錯誤#1009:無法訪問空對象引用的屬性或方法

function movers(event:Event):void 
{ 
    for (var qwerty:int=0;qwerty<=(ALIEN.length);qwerty++) { 
    var run:Object=ALIEN[qwerty]; 
    run.rotation=Math.atan2(bc.y-run.y,bc.x-run.x)/(Math.PI/180); 
    run.x+=Math.cos(sym.rotation*Math.PI/180)*SPD; 
    run.y+=Math.sin(sym.rotation*Math.PI/180)*SPD; 
    } 

    if (ftblFLY) { 
    ftbl.x+=Math.cos(ftbl.rotation*Math.PI/180)*7; 
    ftbl.y+=Math.sin(ftbl.rotation*Math.PI/180)*7; 
    } 

    for (var wer:int=0;wer<=(team.length);wer++) { 
    if (ftbl.hitTestObject(wer)) { 
     if (wer!=bc) { 
     bc=wer; 
     ftblFLY=false; 
     } 
    } 
    } 

    if (bc!=wr) { 
    wr.x+=Math.cos(wr.rotation*Math.PI/180)*SPD; 
    wr.y+=Math.sin(wr.rotation*Math.PI/180)*SPD; 
    } 

    for (var asdf:int=0;qwerty<=(ALIEN.length);asdf++) { 
    var runner:Object=ALIEN[asdf]; 
    if (runner.hitTestObject(bc)) { 
     stage.removeEventListener(Event.ENTER_FRAME,movers); 
     stage.removeEventListener(KeyboardEvent.KEY_DOWN,keyers); 
     stage.removeEventListener(MouseEvent.CLICK,clicko); 
     texter.text="Tackled!!!"; 
    } 
    } 

    bc.x+=Math.cos(bc.rotation*Math.PI/180)*(SPD*playaRD); 
    bc.y+=Math.sin(bc.rotation*Math.PI/180)*(SPD*playaRD); 
    bc.rotation=bc.rotation+(turno*playaTD); 

    ftbl.rotation=bc.rotation; 
    ftbl.x=bc.x; 
    ftbl.y=bc.y; 

    if (bc.y<=0) { 
    stage.removeEventListener(Event.ENTER_FRAME,movers); 
    stage.removeEventListener(KeyboardEvent.KEY_DOWN,keyers); 
    stage.removeEventListener(MouseEvent.CLICK,clicko); 
    texter.text="Touchdown!!!"; 
    } 
} 
+0

您應該進入fla發佈設置並單擊複選框以啓用調試。這樣,當您收到錯誤消息時,它會直接指向發生錯誤的行號。因爲這一切看起來像時間線代碼,並且這些對象中的許多*可能是舞臺上的動畫片段或按鈕,只是簡單的代碼檢查可能會或可能不會發生什麼是空的......可能是因爲您正在嘗試引用一個當時不存在的剪輯(不管你是否認爲它是)。所以得到具體的線路號碼,如果還不清楚,請回來發佈。 – scriptocalypse 2011-03-26 14:43:30

回答

1

< ALIEN.length不< =相同與WER

是這樣的:

for (var qwerty:int=0;qwerty<(ALIEN.length);qwerty++) { 

for (var wer:int=0;wer<(team.length);wer++) { 

for (var asdf:int=0;qwerty<(ALIEN.length);asdf++) { 

可以說你有一個數組×10個的對象,那麼你的

x.length是10
但是你的數組將從0開始,所以你將得到來自
的數值 X [0]到x [9]
因此 ,如果這樣做:
爲(VAR我:= 0;我< =(x.length);我++){
你不會得到一個值爲[10],所以你得到一個空對象引用錯誤。

+0

感謝幫助,但由於某種原因,它仍然返回錯誤 – SDuke 2011-03-26 02:14:26

+0

@ SD5然後有另一個錯誤,最有可能與您使用的其他對象變量之一。開始評論該函數的各個部分,並確定代碼的哪個特定部分正在拋出該錯誤。讓我知道你發現了什麼。 – Saad 2011-03-26 02:34:51

+1

這應該會讓你的生活變得更輕鬆 - Flash IDE中一個鮮爲人知的技巧就是你可以設置它來爲運行時錯誤提供行數,所以在你找到你想要的內容之前,你不必評論代碼對於。這裏是我寫的關於這個主題的博客文章:http://mykola.bilokonsky.net/2010/08/get-line-numbers-on-runtime-errors-in-flash/ – Myk 2011-03-26 19:31:56

1

你的編碼規範使代碼難以理解......

你有沒有初始化外國人[]數組的功能之外,或者你的循環?如果你沒有,Flash會拋出你看到的錯誤。在初始化之前,您不能使用變量。

如果你沒有,你可以使用

var ALIEN:Array = new Array(); 

var ALIEN:Array = []; 

當你的進步,你可能要考慮的載體,這在迭代提供了一些優勢。

祝你好運!

+0

使用第二個。減少開銷並創建相同的事物。它被記錄爲實例化數組的最佳方法 – Glycerine 2011-03-26 14:45:02

+1

@Glycerine,你知道Vector和其他對象是否也是這種情況?我一直更喜歡「新」關鍵字(因爲我喜歡調用對象構造函數的想法,因爲C++是我的第一個真正的語言),但許多消息來源說「[]」要快得多。但是,如果所有對象容器(數組,向量,字典,對象)都是這樣,我將開始使用它並習慣語法。 _編輯:我剛剛回答我自己的問題使用Flash Builder - 它不。 「[]」是嚴格的數組類型,不適用於矢量或字典._ – 2011-03-26 19:06:20

+1

我不認爲Vector對象具有簡寫形式* _citation needed_ yet - 但數組[]和對象{}與Flash生成器。我會檢查,但我的閃光燈今天是愚蠢的。我當然在文檔中看到'new Array()'和'new Object()'是不需要的,創造的危害遠不止於此。我同意你的聲明,但你更喜歡它。 – Glycerine 2011-03-27 02:48:30

相關問題