2017-06-12 4 views
1

ich mit meinem Code ein großes Problem habenEntfernen einer Funktion von der Bühne

Ich habe eine Funktion namens „delayCallFuntions“:

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

Und ich habe diese Funktion wie unten Verbindung zwischen 2 Punkt zu machen in meinem Bildschirm:

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

Und Funktion "timer011" macht die Verbindungen:

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); 

}

Mein Problem ist: ich einige dieser Funktionen wie "timer012" haben "timer013", ... dass sie nacheinander ausführen müssen. Wenn ich aus dieser Szene gehe und wieder zurückkomme, funktionieren immer noch einige dieser Funktionen, während ich sie brauche, um von Anfang an zu beginnen und eins nach dem anderen zu gehen.

zum Beispiel: wenn ich zurückkomme, wird "timer011" gestartet, während auch "timer016" gleichzeitig beendet wird.

hoffe jemand kann mir helfen, da dieses Problem mich frustriert hat.

+0

Können Sie etwas besser erklären, was Ihr Programm zu erreichen versucht. Klingt, als ob Sie nur einige Funktionen in einer verzögerten Kette anstehen möchten? Also wird eine ausgeführt, dann 1 Sekunde später die nächste usw .. Und Sie möchten diese Kette stoppen können, wenn der Benutzer die Szene/den Rahmen verlässt? – BadFeelingAboutThis

+0

@BadFeelingAboutThis Die Funktionen "timer011", "timer012" usw. sollen unterschiedliche Verbindungen zwischen verschiedenen Zellen in meinem Grid herstellen. Sie müssen basierend auf dem Timer ausgeführt werden. Zum Beispiel: timer011 wird nach 100ms ausgeführt und timer012 wird nach 3000ms bis zum Ende ausgeführt. Ich möchte, dass sie gestoppt werden, wenn der Benutzer zur anderen Szene gehen möchte. – mazName

+0

Sie müssen den Verweis auf das ursprüngliche ** Timer ** -Objekt speichern und es stoppen und es zerstören, wenn Sie es nicht mehr benötigen. Außerdem erstelle ich normalerweise ein Feld ** destroyed: Boolean ** und starte Methoden mit ** if (destroyed) return; **, wenn ich also keinen Inhalt mehr brauche und nicht sofort dafür sorgen kann (wie zB verzögerte Aufrufe) , Listener usw.), dann setze ich ** destroyed = true; **, um zu verhindern, dass diese Methoden zur falschen Zeit ausgeführt werden. – Organis

Antwort

1

Derzeit erstellen Sie jedes Mal einen neuen Timer, wenn Sie eine Funktion hinzufügen. Dieser Timer bleibt aufgrund des Ereignis-Listeners im Speicher und da er in der Funktion gekapselt ist, gibt es keine einfache Möglichkeit, ihn erneut zu referenzieren, um ihn zu stoppen.

Was wäre ein besserer Ansatz, ist es, nur einen global referenzierten Timer zu erstellen, so dass Sie es bei Bedarf stoppen können.

Hier ist ein Weg, dies erreichen könnte:

//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(); 
    } 
} 

So, jetzt Sie, indem Sie verwenden würde:

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"); 

Oder mit Ihren spezifischen Code:

delayCallFuntions(1000, timer011, wireColor); 

Jetzt können Sie jederzeit den globalen Timer anhalten (sagen Sie, Sie drücken eine Taste, um Szenen zu wechseln).

funcTimer.stop(); 
+0

es funktioniert einwandfrei aber ich muss alles neu starten wenn ich wieder auf die szene komme! Nun, mit diesem Code wird die letzte Verzögerung beibehalten und wenn ich zur vorherigen Szene zurückkomme, wird die zweite gleichzeitig mit der ersten gestartet, weil sie bereits in das Array geschoben wurde und die Verzögerung nicht ist 0 wieder! Gibt es irgendeine Möglichkeit, dass ich es beheben kann? – mazName

+0

Sorry, ja, das 'currentFuncObj' als Null initialisieren sollte das beheben. Ich habe die Antwort aktualisiert. – BadFeelingAboutThis

+0

es funktioniert einwandfrei, vielen Dank :-) Kann ich noch eine Frage bezüglich einer Sprite-Variablen stellen? – mazName

Verwandte Themen