2017-06-12 107 views
1

我有一個很大的問題,我的代碼從舞臺

我已經調用的函數「delayCallFuntions」刪除功能:

function delayCallFuntions(delay: int, func: Function) { 
    var timer: Timer = new Timer(delay, 1); 
    timer.addEventListener(TimerEvent.TIMER, func); 
    timer.start(); 
} 

而且我用這個功能類似下面做2點之間的連接在我的屏幕上:

delayCallFuntions(1, function (e: Event) {timer011(wireColor);}); 

和功能 「timer011」 正在連接:

function timer011(firstColor: int): void { 
wireColor = firstColor; 
//GRID is a class 
//Path A to B 
var PathAB: Grid; 
PathAB = new Grid(4, 5, 20, 17, canvas, wireColor); 
this.addChild(PathAB); 

}

我的問題是: 我有幾個的這些功能,如「timer012」,「timer013」,......,他們需要執行一個接一個。 當我離開這個場景再回來時,這些功能仍然有些正在工作,而我需要他們從頭開始並逐個去做。

例如:當我回來時,「timer011」正在啓動,而「timer016」也在同時完成。

希望有人能幫助我,因爲這個問題讓我沮喪。

+0

你能解釋一下你的程序試圖完成什麼。聽起來你只是想排隊延遲鏈中的一些功能?所以一個人執行,然後1秒鐘後,下一個等等。你想要能夠停止,如果用戶移出場景/框架? – BadFeelingAboutThis

+0

@BadFeeling關於此函數「timer011」,「timer012」等是爲了讓我的網格中不同單元格之間的不同連接。他們需要根據計時器執行。例如:timer011在100ms後執行,timer012在3000ms後執行直到結束。我希望當用戶想要去其他場景時停止它們。 – mazName

+0

您需要保存對初始** Timer **對象的引用,並在不再需要它時將其停止並銷燬它。另外,我通常會創建一個字段** destroy:Boolean **並使用** if(destroy)return; **啓動方法,所以當我不再需要某些內容並且無法確保其立即處置(如延遲調用,聽衆等),然後我設置** destroy = true; **來防止這些方法在錯誤的時間執行。 – Organis

回答

1

目前,您每次添加功能時都會創建一個全新的計時器。由於事件監聽器的原因,該計時器將留在內存中,並且由於它封裝在函數中,因此再次引用它來阻止它們並不容易。

什麼是更好的方法,是創建一個全局引用的定時器,以便在需要時停止它。

這是一種方式,你可以做到這一點:

//create an array that will hold all the functions you are planning on calling 
var delayedFuncs:Array = []; 

//this var will be used to store the current function that will be called next 
var currentFuncObj:Object = null; //set it to null so it clears the value when you return to this frame 

//create a single, global timer reference for everything 
//don't initialize it here though 
//if you revisit this frame, you don't want to create a whole new timer, but keep using the previous one 
var funcTimer:Timer; 

//if the timer has already been created (you've been to this frame before), stop it 
if (funcTimer) { 
    funcTimer.stop(); 
}else { 
//if you haven't been to this frame before, create the timer and add the listener 
    funcTimer = new Timer(1,1); 
    funcTimer.addEventListener(TimerEvent.TIMER, nextFunc, false, 0, true); 
} 

//this function adds items to your queue. I've added the ability to also include parameters 
function delayCallFunctions(delay:int, func:Function, ... funcParams):void { 
    //add an object to the array that stores the function, delay, and any parameters to pass to that function 
    delayedFuncs.push({delay: delay, func: func, params: funcParams}); 

    //if the timer hasn't started running yet, start it since we've added something 
    if(!funcTimer.running) nextFunc(); 
} 

//this function runs when the timer completes 
function nextFunc(e:Event = null):void { 

    //if we have an existing function to call, call it 
    if (currentFuncObj){ 
     //invoke the function with the parameters 
     currentFuncObj.func.apply(null, currentFuncObj.params); 
    } 

    //if there are still items in the array, grab the next one 
    if(delayedFuncs.length > 0){ 
     //array.shift grabs the first element in the array and removes it from the array 
     currentFuncObj = delayedFuncs.shift(); 

     //reset the timer 
     funcTimer.reset(); 
     //set the appropriate delay 
     funcTimer.delay = currentFuncObj.delay; 
     //start the timer again 
     funcTimer.start(); 
    } 
} 

所以,現在,你會做使用:

delayCallFunctions(3000, trace, "hello", "world", "I'll be traced 3 seconds from now"); 
delayCallFunctions(2000, trace, "I'll be called 2 seconds after the last one"); 

,或者用特定代碼:

delayCallFuntions(1000, timer011, wireColor); 

現在在任何時候(比如說你點擊一個按鈕去改變場景),你可以停止全局定時器。

funcTimer.stop(); 
+0

它工作正常,但當我回到現場時,我的一切都將重新開始!現在,通過這個代碼,最後的延遲將會保留,當我回到前一個場景時,第二個延遲將與第一個延遲同時開始,因爲它已經被推到陣列,延遲將不會再次!有什麼方法可以修復它嗎? – mazName

+0

對不起,是的,將'currentFuncObj'初始化爲null應該可以解決這個問題。我已經更新了答案。 – BadFeelingAboutThis

+0

它正常工作,非常感謝你:-)我可以問另一個與Sprite類型的變量有關的問題嗎? – mazName