Zurück   Flashforum > Flash > Flash Einsteiger

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 25-08-2006, 10:24   #1 (permalink)
Neuer User
 
Registriert seit: Mar 2004
Beiträge: 53
preloader läd zeigt nur 4 kb an, film läuft trotzdem weiter

Hallo zusammen,

nachdem ich nun einige tage in das finden und modifizieren eines einfachen universellen prealoaders für das importieren externer bilder/filme in meinem flashfilm gesucht habe, bin ich gestern fündig geworden.

Das ganze getestet und gejubelt. So, pustekuchen.

Ich hab das ganze jetzt auf mein neues projekt übertragen und der preloader läd irgendwie nicht das, was er laden soll.

Zusammenfassung des Projektes:
am anfang des films wird ein externes bild geladen. Der pfad des Bildes kommt aus einer php datei. Logischer weise soll der Film erst abspielen, wenn das bild geladen ist, sonst setzt es mitten in der animation ein.

hier der Code:
Code:
// --- variablen einlesen einlesen BG
// variblen in loader verwenden ggf. als _root variable festlegen
var loader_bg:LoadVars = new LoadVars();
loader_bg.onLoad = function(test_bg) {
	if (test_bg) {
		// direktes verwenden der variablen
		bgimage.loadMovie(this.php_bildpfad_bg);
	} else {
		// nur fehlerausgabe, wenn datei nicht geladen
		trace('Konnte php-script nicht finden');
	}
};
// hier die Datei, aus der die Variablen ausgelesen werden
loader_bg.load("header_background.php");

stop();
//Auf der Hauptzeitleiste wird eine onEnterFrame Funktion aufgerufen
//Das bewirkt das der Code in {  } mit eingestellten Bildrate wiederholt wird
//Hier also 25x pro Sekunde
this.onEnterFrame =	function(){
	//die Variable geladen gibt an wieviele Bytes bereits geladen wurden
	geladen	=	this.bgimage.getBytesLoaded();
	//die Variable gesamt gibt an wieviele Bytes der Film beinhaltet
	gesamt 	=	this.bgimage.getBytesTotal();
	//die Variable prozent gibt an wieviel Prozent bereits geladen wurden
	prozent	=	geladen * 100 / gesamt;
	//In das dynamische Textfeld mc_prozent wird der Text geschrieben der nach = folgt
	//Da die Variable prozent eine hässliche lange Nachkommazahl ergeben würde runden wir
	//Die Ausgabe ist also die Variable prozent und es wird der Text % geladen angefügt
	mc_prozent.text = Math.round(geladen)+"kb / "+gesamt+"kb";
	//Nun wird der Ladebalken dynamisch vergrößert
	//Der Ladebalken ist 2*prozent breit. Das heißt wenn z.B. 45 Prozent geladen sind
	//ist der Ladebalken 90 Pixel breit. Die max. Breite ist also 200 Pixel
	mc_ladebalken._width = prozent*2;
	//Wenn nun die geladenen Bytes größer oder gleich den gesamt zu ladenden Bytes sind
	//dann wird in Bild 2 gesprungen, wo der Film anfängt und die onEnterFrame Funktion
	//gelöscht
	if(geladen >= gesamt) {
		// this.play();
		this.gotoAndPlay(5);
		delete this.onEnterFrame;
	}
}
Ich habe einen MovieClip (instanz: bgimage) und eine textausgabe (instanz: mc_prozent). Das erste schlüsselbild des movieclips liegt in im gleichen Bild (bild 1) wie das script. die anderen schlüsselbilder haben den gleichen instanznamen und liegen bei bild 5 und 20.

Wie schon gesagt, der film spielt ab, aber ohne das der preloader wirklich die größes des bildes läd, sondern halt nur 4k.

bitte bitte keine links auf den schönen prealoader hier im forum, da habe ich nämlich auch schon geschaut und der funkctioniert bei mir auch nicht ... mir wäre (auch vom verständnis) sehr geholfen, wenn ihr mir helfen könntet diesen Preloader hier zum laufen zu bekommen.

Danke schonmal für eure mühen
nightchase ist offline   Mit Zitat antworten
Alt 25-08-2006, 11:19   #2 (permalink)
agedoubleju
Gast
 
Beiträge: n/a
Du hast anscheinend die Abläufe mit asynchronen Befehlen in Flash noch nicht richtig verstanden. Dein Script wird nämlich von oben durchlaufen, der load-Befehle gestartet, aber das Script gleich weiter abgearbeitet. D.h. dein onEnterFrame-Event wird schon mal durchlaufen, ohne dass in bgimage sich etwas tut.

Irgendwann später löst dann der Response den onLoad-Callback der LoadVars-Klasse aus...

Einige Abläufe solltest du also ändern: zuerst einmal setz einen sendAndLoad statt nur eines load-Befehls. Dann starte den Preloader erst wenn du im onLoad-Callback den loadMovie-Befehl sicher gestartet hast, bspw.:
PHP-Code:
function geladen(erfolgreich) {
        if(
erfolgreich) {
             
trace("empfangene Variable: "+this.this.php_bildpfad_bg);
             
_level0.bgimage.loadMovie(this.php_bildpfad_bg);
            
_level0.preloader();
        }
        else {
                
trace("Fehler beim Laden");
        }
}

function 
preloader(){
   
_level0.onEnterFrame = function(){//Preloader, kontinuierliche Überprüfung des Ladevorgangs
       
var fin int(_level0.bgimage.getBytesLoaded()*100/_level0.bgimage.getBytesTotal());//Prozentwerte berechnen
       
trace("fin="+fin);//Prozentwert testhalber ausgeben
       
_level0.ausgabe.text="[ "+fin+" % geladen ]";//diesen Text in der Textfeldinstanz "ausgabe" zeigen 
       
_level0.mcPre.gotoAndStop(fin);//mcPre ist ein Balkenanimation mit 100 Frames, kann natürlich auch weggelassen werden
       
if(fin >= 100 && _level0.bgimage._width && _level0.bgimage._height>0) {//wenn alles geladen wurde...
           
delete this.onEnterFrame;//dann den Event wieder löschen
           
_level0.ausgabe.text="";//und das Textfeld leeren
        //und hier weitermachen
       
}
   }
}

lv = new LoadVars();//Instanz erstellen
lv.onLoad geladen;//Callback setzen
lv.sendAndLoad("header_background.php",lv,"POST");//und den Request starten 
  Mit Zitat antworten
Alt 25-08-2006, 12:13   #3 (permalink)
Neuer User
 
Registriert seit: Mar 2004
Beiträge: 53
wow, ich mußter erstmal denken. weil wie gesagt. hab nicht viel mit actionscript gemacht bisher.

Habe mein Script genommen und nochmal umgeschrieben.

Demnach macht mein script jetzt folgendes:

1) es setzt eine neue instanz lv in die per send and load die variablen geladen werden.
2) es wird ein Callback gesetzt, damit wir wissen, das geladen wurde
3) wir lesen die variablen aus und checken, ob die php datei geladen werden konnte
4) anschließend rufen wir die funktion preloader auf
5) preloader schaut nach, wieviel geladen wurde und wenn sie durchgelaufen ist, gehts weiter.

richtig?

ABER! Wieso wird preloader nicht automatisch aufgerufen, so wie die funktion test. das wäre dann ja auch ungut, weil eventuell das einladen des bildes in test noch nicht abgeschlossen wäre, oder?

hier mein script:

PHP-Code:
stop();

// nur test, ob variablen benutzt werden können, woraus folgt das php script geladen wurde
function ladetest(test) {
    if (
test) { // zuweisen und schauen, ob inhalt wahr ist
        
bgimage.loadMovie(this.php_bildpfad_bg); // direktes verwenden der variablen
        
preloader(); // preloader aufrufen
    
} else {
        
// nur fehlerausgabe, wenn datei nicht geladen
        
trace('Konnte php-script nicht finden');
    }
}

// preloader funktion erstellen
function preloader() {
    
//Auf der Hauptzeitleiste wird eine onEnterFrame Funktion aufgerufen
    //Das bewirkt das der Code in {  } mit eingestellten Bildrate wiederholt wird
    //Hier also 25x pro Sekunde
    
this.onEnterFrame = function() {
        
//die Variable geladen gibt an wieviele Bytes bereits geladen wurden
        
geladen this.bgimage.getBytesLoaded();
        
//die Variable gesamt gibt an wieviele Bytes der Film beinhaltet
        
gesamt this.bgimage.getBytesTotal();
        
//die Variable prozent gibt an wieviel Prozent bereits geladen wurden
        
prozent geladen*100/gesamt;
        
//In das dynamische Textfeld mc_prozent wird der Text geschrieben der nach = folgt
        //Da die Variable prozent eine hässliche lange Nachkommazahl ergeben würde runden wir
        //Die Ausgabe ist also die Variable prozent und es wird der Text % geladen angefügt
        
mc_prozent.text "loading "+Math.round(geladen)+".kb / "+Math.round(gesamt)+".kb";
        
//Nun wird der Ladebalken dynamisch vergrößert
        //Der Ladebalken ist 2*prozent breit. Das heißt wenn z.B. 45 Prozent geladen sind
        //ist der Ladebalken 90 Pixel breit. Die max. Breite ist also 200 Pixel
        
mc_ladebalken._width prozent*2;
        
//Wenn nun die geladenen Bytes größer oder gleich den gesamt zu ladenden Bytes sind
        //dann wird in Bild 2 gesprungen, wo der Film anfängt und die onEnterFrame Funktion
        //gelöscht
        
if (geladen>=gesamt) {
            
// this.play();
            
this.gotoAndPlay(5);
            
mc_prozent._visible false;
            
delete this.onEnterFrame;
        }
    }
}


// hiermit lade ich die Variablen aus einer php Datei
lv = new LoadVars();//Instanz erstellen 
lv.onLoad geladen;//Callback setzen 
lv.sendAndLoad("header_background.php",lv,"POST");//und den Request starten 
ähm, klappt aber nicht. spielt jetzt gar nicht mehr ab

Geändert von nightchase (25-08-2006 um 12:36 Uhr)
nightchase ist offline   Mit Zitat antworten
Alt 25-08-2006, 12:27   #4 (permalink)
................
 
Benutzerbild von Der Frager
 
Registriert seit: Jun 2004
Beiträge: 15.890
Zitat:
Zitat von nightchase
ähm, klappt aber nicht. spielt jetzt gar nicht mehr ab
...ganz eventuell solltest du deiner Funktion auch einen Namen ("geladen" würde sich anbieten) geben.
__________________

ternärer Konditionaloperator

+++ Bitte keine Privat-Nachrichten bezüglich Flashfragen! +++
Der Frager ist offline   Mit Zitat antworten
Alt 25-08-2006, 12:36   #5 (permalink)
Neuer User
 
Registriert seit: Mar 2004
Beiträge: 53
ok, getan. Aber passiert immer noch nichts... er bleibt beim ersten bild stehen
nightchase ist offline   Mit Zitat antworten
Alt 25-08-2006, 13:58   #6 (permalink)
................
 
Benutzerbild von Der Frager
 
Registriert seit: Jun 2004
Beiträge: 15.890
Hmm... Vielleicht mal nicht geladen nennen (gibt ja auch eine Variable, die so heißt). Wird denn das Bild angezeigt?
__________________

ternärer Konditionaloperator

+++ Bitte keine Privat-Nachrichten bezüglich Flashfragen! +++
Der Frager ist offline   Mit Zitat antworten
Alt 25-08-2006, 14:00   #7 (permalink)
agedoubleju
Gast
 
Beiträge: n/a
Schau dir in meinem Script mal die Objektpfade zu deinen MCs an... Dann versuch mal mit ein paar trace-Befehlen im Testmodus zu ermitteln, ob deine Objekte so nicht evtl. undefined sind...
  Mit Zitat antworten
Alt 25-08-2006, 14:32   #8 (permalink)
Neuer User
 
Registriert seit: Mar 2004
Beiträge: 53
Ok, hab noch einen fehler gefunden. Das ganze läuft jetzt. ABER wieder das gleiche problem wie ganz am anfang. er wartet nicht, bis das bild in den movieclip geladen wurde, sondern geht direkt los.

hier der neue code. habe unten den aufruf der ladetestfunktion korregiert.

Aber mehr finde ich einfach nicht, ich verzweifle hier

PHP-Code:
stop();
// nur test, ob variablen benutzt werden können, woraus folgt das php script geladen wurde
function ladetest(test) {
    
// zuweisen und schauen, ob inhalt wahr ist
    
if (test) {
        
trace(this.php_bildpfad_bg);
        
// direktes verwenden der variablen
        
bgimage.loadMovie(this.php_bildpfad_bg);
        
// preloader aufrufen
        
preloader();
    } else {
        
// nur fehlerausgabe, wenn datei nicht geladen
        
trace('Konnte php-script nicht finden');
    }
}
// preloader funktion erstellen
function preloader() {
    
//Auf der Hauptzeitleiste wird eine onEnterFrame Funktion aufgerufen
    //Das bewirkt das der Code in {  } mit eingestellten Bildrate wiederholt wird
    //Hier also 25x pro Sekunde
    
this.onEnterFrame = function() {
        
//die Variable geladen gibt an wieviele Bytes bereits geladen wurden
        
geladen this.bgimage.getBytesLoaded();
        
//die Variable gesamt gibt an wieviele Bytes der Film beinhaltet
        
gesamt this.bgimage.getBytesTotal();
        
//die Variable prozent gibt an wieviel Prozent bereits geladen wurden
        
prozent geladen*100/gesamt;
        
//In das dynamische Textfeld mc_prozent wird der Text geschrieben der nach = folgt
        //Da die Variable prozent eine hässliche lange Nachkommazahl ergeben würde runden wir
        //Die Ausgabe ist also die Variable prozent und es wird der Text % geladen angefügt
        
mc_prozent.text "loading "+Math.round(geladen)+".kb / "+Math.round(gesamt)+".kb";
        
//Nun wird der Ladebalken dynamisch vergrößert
        //Der Ladebalken ist 2*prozent breit. Das heißt wenn z.B. 45 Prozent geladen sind
        //ist der Ladebalken 90 Pixel breit. Die max. Breite ist also 200 Pixel
        
mc_ladebalken._width prozent*2;
        
//Wenn nun die geladenen Bytes größer oder gleich den gesamt zu ladenden Bytes sind
        //dann wird in Bild 2 gesprungen, wo der Film anfängt und die onEnterFrame Funktion
        //gelöscht
        
if (geladen>=gesamt) {
            
// this.play();
            
this.gotoAndPlay(5);
            
mc_prozent._visible false;
            
delete this.onEnterFrame;
        }
    };
}
// hiermit lade ich die Variablen aus einer php Datei
//Instanz erstellen 
lv = new LoadVars();
//Callback setzen
lv.onLoad ladetest;
 
//und den Request starten
lv.sendAndLoad("header_background.php"lv"POST"); 
nightchase ist offline   Mit Zitat antworten
Alt 25-08-2006, 14:43   #9 (permalink)
Neuer User
 
Registriert seit: Mar 2004
Beiträge: 53
ich habe jetzt deine 2te abfrage bgimage._width > 0 && ._height >0 eingefügt. Jetzt klappts

Danke Holger!
nightchase ist offline   Mit Zitat antworten
Alt 25-08-2006, 22:26   #10 (permalink)
agedoubleju
Gast
 
Beiträge: n/a
Das Problem bei einem onEnterFrame-Event ist halt, dass vor einem Framewechsel zwar der nachzuladenden Film bytemäßig im Cache liegt, der Ziel-MC aber evtl. noch gar nicht befüllt ist. Wenn der Preloader dann genau bei diesem Framewechsel abgebrochen wird, kann der MC in diesem Frame auch nichts anzeigen, frühestens im nächsten Frame wird er gezeichnet.

Andererseits gibt es auch Fälle, wo ein Film nachgeladen wird, der MC aber keine "Größe" bekommt. Da muss man dann sogar auf die Abfrage der Höhe/Breite des MCs verzichten, weil die if-Abfrage im onEnterFrame-Event sonst nie wahr wird...
  Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 08:02 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele