Endlosschleife & _alpha

Pullmann

Erfahrenes Mitglied
HI ich habe ein Problem und zwar will Flash keinen Alphawert zuweisen, hinzukommt das immer das Script abgebrochen wird da es eine Endlosschleife ist. Es handelt sich hier um einen ganz einfachen Bildfade der sich halt immer wiederholt. Kann mir da einer sagen wo ich da nen Fehler mache?

Hier das Script:
PHP:
function loadin(picture,count,param,dep){
	duplicateMovieClip(_root.load_clip,"load_clip"+param,dep);
	var mc = ["load_clip"+param];
	loadMovie(picture[param],_root.mc);
	mc._alpha = 10;
	if(param<count){
		param++;
	}else{
		param=0;
	}
	dep++;
	fade(picture);
	time = setInterval(loadin(picture,count,param,dep), 10000);	
}
function fade(param){
	var mc_fade = ['load_clip'+param];
	_root.mc_fade._alpha += 1;
	if(_root.mc_fade._alpha < 100){
		fade(param);
	}
}
pic = Array('01_20.jpg','02_20.jpg');
loadin(pic,1,0,1)
 
Hi,

1. Dein setInterval-Aufruf ist m.E. syntaktisch falsch. Die übergebenen Parameter sollten der setInterval-Methode nach dem zweiten Parameter übergeben werden:
Code:
time = setInterval(loadin, 10000, picture, count, param, dep);

2. Das Intervall wird mehre Male neu erstellt, ohne gelöscht zu werden (loadin ruft das Intervall auf, welches wiederum loadin aufruft usw.) - dadurch sitzt Du ziemlich schnell auf einer Menge sich überlagernder und unkontrollierbarer Intervalle. ;) Schau mal in die Referenz unter "clearInterval" oder rufe setInterval nur einmal von ausserhalb der Funktion loadin auf.

3. Die Funktion fade ruft sich selbst ohne Verzögerung auf - daher bekommst Du eine Art "Endlosschleife" (genauer: Eine Schleife, die für den Geschmack von Flash zu oft durchlaufen wird). So wird nämlich versucht, alle Durchläufe (und damit auch alle Alphaänderungen) auf einmal (sprich: in einem Frame) auszuführen. Du solltest auf dem übergebenen MC eine onEnterFrame-Methode ausführen, die den Alphawert bei jedem Frameaufruf erhöht. Such hier im Forum mal nach "Slideshow", "Alpha", "Fade" o.ä. Hier sollten einige Beispiele dazu rumschwirren.

Gruß
.
 
HI...

also das Problem ist das Flash nicht die zusammensetzung der Variablen annehmen will
womit ich den MC anspreche...

PHP:
function fade(dep){

    trace(["load_clip" + dep]._alpha);
	["load_clip"+dep]._alpha += 1;
	if(["load_clip"+dep]._alpha < "100"){
		fade(dep);
	}
}

das sollte doch so richtig sein ... aber wenn ich den Alphawert trace kommt da undefiniert!
 
HI,

es liegt nicht an der Abfrage sondern an dem MC .... wenn ich [load_clip+dep]._alpha aufrufe ist das undefined
 
Hi,

Du kannst Objekte nicht per Arrayoperator zusammensetzen, wenn dieser nicht als Index eines "Mutterobjektes" verwendet wird:
Code:
var foo1 = "bar";
trace(["foo" + 1]); // gibt "foo1" aus

var foo1 = "bar";
trace(this["foo" + 1]); // gibt "bar" aus
Probiers also mal mit:
Code:
var mc_fade = _root['load_clip'+param];

Gruß
.
 
Okay danke das ist es ... wie man ganz oben sieht hatte ich das auch am Anfang so gemacht ...


Ich habe jetzt alledings ein neues Problem und zwar will der nicht aufhören den Alphawert zu erhöhen:
PHP:
function fade(dep){
	var mc_fade = _root['load_clip'+dep];	
	mc_fade._alpha += 1;
	trace(mc_fade._alpha);
	if(mc_fade._alpha <= 100){
		re = setInterval(fade,100,dep);
	}else{
		clearInterval(re);
	}
}

wenn ich aber in den else Zweig einen Trace mache gibt er dort auch was aus ....
aber er ruft halt durchgehen wieder die Funktion auf?
 
Zuletzt bearbeitet:
Ich bekomme diese dämliche Schleife nicht weg ... keiner ne Idee?

Dazu kommt noch das der Preloader nicht so will wie er soll ...

PHP:
preload = function (toload,value){

	_root.loader._visible = true;
	_root.blankMC.loadMovie(toload);

	pre.onEnterFrame = function(){

		var bytestoload = _root.blankMC.getBytesTotal();
		var bytesloaded = _root.blankMC.getBytesLoaded();

		_root.loader.loadtxt.text = value;

		if(bytesloaded > 5){
			_root.loader.loadtxt.text = value;

			if( bytesloaded == bytestoload){

				loader._visible = false;
				delete this.onEnterFrame;
				return 'full';
			}	
		}
	}
}
check1 = preload(pic[0],'datei1');
if(check1 == 'full'){
	preload(pic[1],'datei2');
}

Ich wollte es halt so machen das die Dateien richtig nacheinander geladen werden und
das man das auch sieht ... es scheitert aber schon bei den getBytesTotal und Loaded
denn die sind immer auf 4 und verändern sich auch nicht ...
Wenn ich die Datei hochlade wird der Preloader angezeigt aber die getBytesTotal und Loaded sind leer ... und der String ist immer Datei2 wobei der ja die erste Datei zuerst laden müsste!
 
Hi,


Code:
check1 = preload(pic[0],'datei1');
if(check1 == 'full'){
    preload(pic[1],'datei2');
}
Das kann so nicht funktionieren - Deine Funktion "preload" wird sofort abgearbeitet und ist schon beendet, bevor der erste Frame der dort definierten onEnterFrame-Methode bearbeitet wird. Deine Variable "check1" wird somit immer den Wert "undefined" haben. Auch bringt die einmalige Abfrage dieser Variable nichts - sie wird ihren Wert a) nicht ändern und b) wird die Abfrage ja nur einmal ausgeführt.

Wenn Du mehrere Bilder nacheinander vorladen willst, musst Du mit Ereignissen arbeiten: Sobald die aktuelle Datei komplett geladen ist, kann ein weiterer Funktionsaufruf das Laden der nächsten anstossen. Das könte z.B. so aussehen:
Code:
// Array mit den zu ladenden Dateien:
var files = new Array("bild1.jpg", "bild2.jpg", "bild3.jpg");

// Array mit den Containern für die Dateien:
// (Die Container sind hier leere MovieClips, die sich
//  auf der Bühne befinden)
var ct = new Array(container1, container2, container3);

var current = 0; // Aktuell zu ladendes Bild

loadImg(ct[current], files[current]); // Erstes Bild laden!

// Funktionen:

function loadImg(destination, src) { // lädt die Datei unter "src" in den MC "destination"
	// damit wir auf "destination" eine onEnterFrame-Methode ausführen
	// können, erstellen wir dort zunächst einen leeren MC und laden
	// die Datei in Wirklichkeit dort hinein:
	var img = destination.createEmptyMovieClip("img", 1);
	img.loadMovie(src); // Ziel laden
	destination.onEnterFrame = function() {
		var cur = img.getBytesLoaded();
		var max = img.getBytesTotal();
		// erst wenn beide Werte etwas zurückliefern,
		// das größer 0 ist, werden Prozente berechnet:
		if (cur > 0 && max > 0) {
			var percent = cur * 100 / max;
			// Hier könnten wir etwas ausgeben:
			textfeld1.text = "lade Datei " + src;
			textfeld2.text = parseInt(percent, 10) + "% geladen ...";
			// Wenn alles geladen ist:
			if (percent >= 100) {
				// Sagen wir bescheid:
				finished();
				delete this.onEnterFrame;
			}
		}
	}
}

function finished() { // wird aufgerufen, wenn eine Datei geladen wurde
	// wenn noch was zu laden übrig ist:
	if (current < files.length - 1) {
		// Zähler um 1 erhöhen:
		current ++;
		// ... und das entsprechende Bild in den
		// entsprechenden Container laden:
		loadImg(ct[current], files[current]);
	}
}

Gruß
.
 
HI, soweit so gut das habe ich jetzt verstanden ... doch jetzt habe ich ein neues Problem und zwar meint Flash das in dem MC in den ich vorlade nichts drin ist! Ich habe den MC ausserhalb des Sichbarenbereichs platziert und wenn ich nen Probelauf mache ist da auch das Bild drin das ich vorlade...

Doch die Bytes sind immer noch auf 4...

PHP:
_root.blankMC.loadMovie(toload[cur]);

var bytestoload = _root.blankMC.getBytesTotal();
var bytesloaded = _root.blankMC.getBytesLoaded();

LG
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück