2017-02-25 73 views
0

我遇到了麻煩,試圖動態訪問該符號,我有9個按鈕,都調用此方法,並且它們傳遞到它們的位置(tl,t,tr等)這個方法在另一個程序之前,它沒有問題,但在這個程序中失敗。ActionSctipt 3.0錯誤:

我試圖訪問一個符號調用s_tl(示例位置),但我所得到的是未定義的(查看結果)。

function turn(btn : String):Function { 
return function(e:MouseEvent) { 
    var players_turn : int; 
    var chosen : String = "s_" + btn; 

    trace(this); 
    trace(this[chosen]); 
    trace(chosen); 
    trace(this[chosen]); 
    // if crosses turn 0 else 1 
    if (s_c.currentFrame == 1) { 
     players_turn = 0; 
    } else { 
     players_turn = 1; 
    }  

    // check who's turn it is if it's been pressed before 
    if (players_turn == 0 && this[chosen].visible == false) { 
     this[chosen].gotoAndStop(1); 
     this[chosen].visible = true; 
    } else { 
     this[chosen].gotoAndStop(2); 
     this[chosen].visible = true; 
    } 
}; 
} 

結果:

[object global] 
undefined 
s_br 
undefined 
TypeError: Error #1010: A term is undefined and has no properties. 
    at MethodInfo-6() 
+0

我正在追蹤一個新字符串,它是''s_「+ btn',然後會給我我想要訪問的對象的名稱? – Zachary

+0

在我的關鍵幀上,有這些名稱的符號。 s_br是一個符號,我以爲你必須這樣做[s_br]? – Zachary

+0

我不認爲我知道'這'是什麼,我雖然是一個對象,它保存了關鍵幀中的所有對象。如果不是,我如何訪問其中一個對象? – Zachary

回答

1

你的問題是不好的代碼風格。您可以在函數turn()中定義unnamed unbind函數,這就是問題的根源所在。取消綁定函數存在,如跟蹤所示,在全局尋址上下文中,與函數turn()不同,它不綁定到任何特定的顯示對象。您的按鈕可能與turn()存在於相同的尋址上下文中。參數btn在未命名函數中可用,因爲ECMA標準指示(如果函數A創建函數B,則A的局部變量(包括參數)在B中可用作局部變量),但這是非常非常糟糕的做法代碼混亂並引起頭痛。

請解釋一下您試圖用該代碼實現的內容,以便我們解開它並以非扭曲的方式重寫。 Okey,我基本上認爲你在做Tic Tac Toe。現在,準則。一個單元格必須包含3個幀:第一幀用於按鈕圖形,第二個和第三個用於XO。將它們命名爲:s_1,s_2等。

for (var i:int = 1; i < 10; i++) 
{ 
    var aCell:MovieClip = getChildByName("s_" + i) as MovieClip; 
    aCell.addEventListener(MouseEvent.CLICK, onTic); 
} 

function onTic(e:MouseEvent):void 
{ 
    var playersTurn:int = s_c.currentFrame; 
    var aCell:MovieClip = e.currentTarget as MovieClip; 

    trace(aCell.name); 

    // Now, the magic. 
    aCell.gotoAndStop(playersTurn + 1); 
    aCell.removeEventListener(MouseEvent.CLICK, onTic); 
} 
+0

我已經編碼它,所以我可以避免做出9個單獨的事件函數,這樣我使用一個函數並傳入一個「ID」可以這麼說,然後我可以檢查哪個按鈕被按下並顯示正確的符號。附:我之前從未在ActionScript中編寫任何代碼 – Zachary

+0

字段e.currentTarget包含事件的來源。如果您爲9個按鈕訂閱一個方法,則可以分辨哪個按鈕被按下。 – Organis

+0

不久前,我解釋了同樣的事情:http://stackoverflow.com/questions/42408816/hovering-off-dpad-sometimes-makes-character-move-infinitely-in-one-direction/42421460#42421460 – Organis