unendliche Rekursion

inctube

Erfahrenes Mitglied
Hallo,

ich habe jetzt schon seit einiger Zeit immer das selbe Problem.
Ich möchte gerne, dass beim rollover über einen movieclip eine rekursive funktion aufgerufen wird.
Allerdings führt dies immer zu einen unendliche Rekursion, was ja auch logisch ist.
Nun meine Frage, wie fang ich das ab Ich habe es schon mit einer boolean Variable probiert, aber irgendwie will das nicht so wie ich das gerne hätte...
Hier mal mein Code:
PHP:
#include "lmc_tween_as1.as"
activatet_winter = false;
this.winter.onRollOver = function() {
//Das war der Boolean Test
/*	activatet_winter = true;
	if (not activatet_winter) {
		start(0, 112, 0, elements-1);
	} else {
		return;
	}*/

	function start(from, to, no, layer) {
		trace("disser");
		this.attachMovie("mc_button", "button"+no, layer);
		this["button"+no].inhalt.text = topics[no];
		this["button"+no].tween("_x", to, 1, "linear");
		from = to;
		if (no == elements-1) {
			return;
		}
		start(from, to+112+20, no+1, layer-1);
	}
};

thx inctube
 
Hallo,

auch wenn du grade eben noch keine Probleme damit hattest, empfehle ich dir dringend, deine Funktion nicht start zu nennen, Trunctations (Kollisionen von selbst definierten und Flash-nativen Namen) sind so vorprogrammiert.

Nun zu deinem eigentlichen Problem. Auf den ersten Blick seh ich, dass die Überprüfung der boolschen Variable nur beim ersten Aufruf der Funktion stattfindet, nicht aber wenn die Funktion jeweils aus sich selber wieder aufgerufen wird.
Wenn ich dich richtig verstehe, willst du die Funktion dann aber mit folgender Bedingung killen:

PHP:
if (no == elements-1) {
     return;
}

Wenn dem so ist, dann musst du den darauffolgenden Aufruf der Funktion start in eine else-Schaufe packen. Die Anweisung return beendet eine Funktion nicht, sondern gibt bloss einen Wert an die aufrufende Instanz zurück:

Zitat Flashhilfe
return[expression]

Gibt den von einer Funktion zurückgegebenen Wert an. Die Funktion return wertet den in expression angegebenen Ausdruck aus und gibt das Ergebnis als Wert der Funktion zurück, in der sie ausgeführt wird. Durch die return-Anweisung gibt die Ausführung das Ergebnis unmittelbar an die aufrufende Funktion zurück. Wird die Anweisung return alleine verwendet, wird undefined. zurückgegeben.

Daraus folgt:
PHP:
if (no == elements-1) {
     return "Endliche Rekursion";
} else {
     start(from, to+112+20, no+1, layer-1);
}

EDIT:
Eben seh ich, dass du ausserdem die Definition der Funktion auch in die rollOver-Funktion gepackt hast. Auch nicht sehr praktisch. Raus damit ;).


gruss
 
Zuletzt bearbeitet:
Wie kann ich das aber dann machen, dass die erst aufgerufen wird, wenn ich mit der Maus über einen Button fahre
 
Hallo,

wenn eine Funktion definiert wird, wird sie nicht ausgeführt, sondern erst wenn du sie dann aufrufst.

Als Beispiel:

PHP:
function meinName(Name) {
    trace (Name);
}

Nun hast du eine Funktion definiert, die von nun an mit der richtigen Pfadangabe von überall her in deinem Film aufgerufen werden kann, ausgeführt wurde sie aber noch nie. Das geschieht hiermit:
PHP:
meinName("Lukas");
//output: Lukas

Auf deinen Code angewandt (wobei ich das jetzt nicht testen kann), den ich auch n kleines bisschen aufgeräumt hab ;) :
PHP:
function start(from, to, no, layer) {
     trace("disser");
     this.attachMovie("mc_button", "button"+no, layer);
     this["button"+no].inhalt.text = topics[no];
     this["button"+no].tween("_x", to, 1, "linear");
     from = to;
     if (no == elements-1) {
         return "Endliche Rekursion";
     } else {
         start(from, to+112+20, no+1, layer-1);
     }
}

var activated_winter = false;
this.winter.onRollOver = function() {
    if (!activated_winter) {
        this._parent.start(0, 112, 0, elements-1);
        this._parent.activated_winter = true;   
    } 
};

Einen kleinen Tipp hab ich noch. Verwende statt "not" als Vergleichs-Operand besser !, weil "not" wurde in Flash 8 abgeschafft.

gruss
 
Zuletzt bearbeitet:
Zurück