Preloading von dynamisch eingebundenen JPGs

Barzille

Grünschnabel
Moin Moin liebe Community,
ich brauch etwas Hilfe, da ich auch nach einigem Suchen keine Antwort auf mein Problem gefunden habe...

Meine Idee:
Ich möchte eine automatische Diashow generieren! Und das läuft mittlerweile so:
- Über ein PHP-Script lese ich Bildernamen als Variablen für Flash mittels LoadVars ein
- Über ein MC lasse ich alle paar Sekunden das geladene Bild ändern
- Die Bilder liegen in einem Array pictures
- Ich benutze 4 Frames
- Der erste für das Laden der Variablen
- Der zweite und dritte fürs preloaden
- Der vierte für die eigentliche Diashow

Frames 1 und 4 funktionieren auch schon, nur weiß ich nicht wie ich in den Frames 2 und 3 solange laufen lassen kann, bis alle jpgs geladen sind... Ich möchte am liebsten eine genaue Aussage über die Größe aller zu ladenden Bilder!
Über this.getBytesTotal bekomme ich nur ca 80kb, egal wieviele Bilder da sind...
Mit einer for-Schleife und einem akkumulieren der pictures[i].getBytesTotal() gehts auch nicht :(

Hier ist mal mein Quellcode, ich hoffe ihr könnt mir helfen, wie ich die Bytes der Bilder richtig auslesen kann

Frame 1:

PHP:
var pictures = new Array();
var anzahl:Number;
var lv = new LoadVars();
lv.load("imagelist.txt");
var count:Number = 1;
this.createEmptyMovieClip("Clip", 1);
Clip._x = 10;
Clip._y = 10;
lv.onLoad = function() {
	anzahl = this["anzahl"];
	for(var i=1;i<=anzahl;i++){
		pictures[i]=this["bild"+i];
		}
	gotoAndPlay(2);
	}

Frame 2: (das was noch nicht klappt)

PHP:
var kbtotal:Number ;
var kbgeladen:Number;
trace("gesamt: "+Math.round(this.getBytesTotal()/1024)+"kb");

Frame 3:

PHP:
gotoAndPlay(2);

Frame 4:

PHP:
stop();
countup();
setInterval(countup, 1000);
function countup() {
	Clip.loadMovie(pictures[count]);
	if (count == anzahl) {
		count = 1;
	} else {
		count++;
	}
}
 
Hi,

lass diese Framegeschichte weg (dafür sind sie nicht da) und arbeite mit Ereignissen und onEnterFrame-Methoden (mit denen Du prima Frames "simulieren" kannst).

Beispiel: Du willst vier Bilddateien lasen und führst nun vier mal eine loadMovie-Aktion aus. Flash wartet nun keinesfalls auf die Bilder und lädt sie auch nicht unbedingt nacheinander, sondern macht stur mit der nächsten AS-Zeile (und den nächsten Frames) weiter ... Du musst also alles andere anhalten, wärend Du laufend überprüfst, wie weit die Bilder schon sind.

Wenn Du mehrere Dateien vorladen willst, schau mal im Sammelthread (in der FAQ) nach dem "multiloader" (eine aktuellere Version gibts auch auf meiner Seite zum Herunterladen).

Gruß
.
 
Hallo Datic,
danke für deine Antwort. Ich habe mir mal den Multiloader v5 angeguckt und versucht, dort meinen Code einzubauen, also z.B.:

PHP:
var pictures = new Array();
var lv = new LoadVars();
lv.load("imagelist.txt");
var count:Number = 0;
this.createEmptyMovieClip("Clip", 1);
Clip._x = 10;
Clip._y = 10;
lv.onLoad = function() {
	//	Clip.loadMovie(this["bild"+1]);
	anzahl = this["anzahl"];
	trace("Anzahl: "+anzahl);
	for (var i = 0; i<anzahl; i++) {
		pictures[i] = this["bild"+(i+1)];
	}
	this.onEnterFrame = function() {
		loader.preload(pictures);
		delete this.onEnterFrame;
	};
};
countup();
setInterval(countup, 1000);
function countup() {
	trace("Counter: "+count);
	trace("Lade Bild "+pictures[count]);
	Clip.loadMovie(pictures[count]);
	if (count == (anzahl-1)) {
		count = 0;
	} else {
		count++;
	}
}

Anscheinend habe ich da aber noch etwas nicht verstanden mit dem OnFrameEnter Event, denn die Bilder werden schon dargestellt, bevor sie geladen sind.
Ich habe auch im loader-AS gesehen, dass dort eine Stelle kommentriert ist, bei der man eine Weiterleitung eintragen soll.
PHP:
function nextOne() {
	loaded ++;
	if (loaded >= c - 0) {
		// Hier Weiterleitung einfügen!
		trace("ALL LOADED");
	}
}
Wie sieht denn sowas aus?
 
Hi,

Du kannst Deine Funktion "countup" nicht mit diesem Preloader mischen, da beide die angegebenen Bilder laden. Wenn der Multiloader alle Dateien komplett geladen hat, wird dieser Block:
Code:
    if (loaded >= c - 0) {
        // Hier Weiterleitung einfügen!
        trace("ALL LOADED");
    }
ausgeführt. An diese Stelle musst Du den ersten Aufruf Deiner Funktionen setzen - die Bilder sind dann im Cache und werden ohne Verzögerung angezeigt.

Gruß
.
 
Zurück