2014-05-18 51 views
0

我有一個問題,我希望你能幫我解決。我做了代碼:Array和EnterFrame eventlistener

var dates_array:Array =[y1,y2,y3]; 
var i= 1; 

for each(var dates_sym:MovieClip in dates_array){ 
    dates_sym.visible=false; 
}; 

france_map.addEventListener(Event.ENTER_FRAME, fnCheckDate); 
function fnCheckDate (evt:Event):void{ 
var i = france_map.currentFrame; 
} 

function fnDateSym (evt:Event):void{ 
dates_array[i].visible=true; 
} 

它應該制定一個符號(Y1,Y2或Y3(有更多的符號,但沒有把它們放在爲清晰起見,代碼),這取決於什麼框架主要出現上符號是。當我編譯時,它沒有顯示任何錯誤,但是當我在我的應用程序中嘗試它時,沒有任何反應。 我還是一個初學者,我真的沒有看到有什麼問題 如果你需要更多的上下文,我可以 Jeryl

回答

0

您的fnCheckDate功能在輸入框架上被調用,但該功能從未做過任何事情,除了設置i。另一個功能 - fnDateSym - 根據i的值設置visible屬性。這是你想要的 - 但fnDateSym永遠不會在你的發佈代碼中的任何地方調用。

這可能只是因爲你遺漏了一些代碼。我猜你可能會從其他地方撥打fnDateSym,並期望它使用fnCheckDate設置的全球i。是的,它使用全球i。但fnCheckDate設置全球i

var i = france_map.currentFrame; 

var關鍵字聲明當前範圍內的變量。一個函數創建一個新的作用域。換句話說,你聲明瞭一個函數本地的變量i,並將currentFrame的值賦值爲 - 而不是全局範圍(var i = 1)中已有的變量i。當你的函數退出,當地i「丟失」 - 與全球i沒有改變 - 它仍然是1

所以速戰速決是簡單地將其更改爲:

i = france_map.currentFrame; 

現在,您並未聲明新變量,而是設置全局變量i的值。

ETA:「教你如何釣魚,而不是給你一個魚」有點...一個簡單的方法來調試這些類型的問題是檢查使用trace函數的變量的值。例如:

function fnDateSym (evt:Event):void 
{ 
    trace("i is:", i); 
    dates_array[i].visible=true; 
} 

現在,如果你看不到任何痕跡,這意味着你的函數不叫在所有的輸出窗口。如果你經常看到「我是:1」,那麼你知道i不會改變,並且這是問題的根源。您可以使用trace(i) - 我只是傾向於向跟蹤中添加某種文本 - 使您可以更輕鬆地分辨出輸出中的每行是什麼,以及何時存在更多跟蹤。

無關,只是有點代碼審查的...

注意ENTER_FRAME被觸發每幀刷新。即,這並不意味着「當我在時間線上輸入新的幀」。它只是意味着,「當一個框架在玩家中繪製」。換句話說,它被稱爲每秒24次 - 或者您在Flash中選擇的任何幀速率 - 無論currentFrame是否不更改(例如因爲您稱爲france_map.stop())。

這對你的情況可能沒有問題 - 畢竟,設置visibletrue每秒24次實際上不會引起任何副作用。但是,如果你做的不僅僅是這些,它可能是浪費 - 或者它可能會導致意想不到的問題,因爲它比你想要的更頻繁地被調用。

的一種方式,以使類似「進入時間表幀」事件的東西是:

var previousFrame:int; // used for storing the last currentFrame we encountered 

mc.addEventListener(Event.ENTER_FRAME, enterFrameListener); 

function enterFrameListener(event:Event):void 
{ 
    // Are we on a different frame than last time? 
    if (previousFrame != mc.currentFrame) 
    { 
     currentFrameChanged(); 
     previousFrame = mc.currentFrame; 
    } 
} 

function currentFrameChanged() 
{ 
    // Do stuff that should be done when the current frame changes 
    // - rather than on every frame refresh. 
} 

很難告訴你究竟是如何做的事情(再次,因爲它似乎在通話fnDateSym被遺漏) - 但取決於如何調用fnDateSym,大多數情況下根本不需要fnCheckDate。只要做到:

dates_array[france_map.currentFrame] = true; 

除此之外,只爲「正派」,你可能要申報類型i

var i:int = 0; 
+0

感謝幫助。我改變了我我變得我,它的工作。但是,我做了你我建議並用date_array [france_map.currentFrame]替換函數fnCheckDate!我不知道EnterFrame,所以我很高興你花時間來解釋和給出一個替代方案。非常感謝! – Jeryl

+0

哦,是的,我打電話給代碼中較高的fnDateSym,但我忘了複製/粘貼它:) – Jeryl