[MX2004] Frage zu PreloaderTut von rena

Budman

Erfahrenes Mitglied
[MX2004] Preloader will nicht...

Hallo!

Ich hätte da ein paar Fragen, die mir leider aufgrund mangelnden Wissens trotz Studium des Tut's verborgen geblieben sind.

Damit alle wissen, um was es sich handelt: Link zum Tut

Meine Fragen wären nun folgende:
  • Wie baue ich diesen Preloader um, damit ich ihn auch für den Hauptfilm benutzen kann (sprich auch während des Ladevorgangs des Hauptfilms)?
  • Wie kann ich diesen ohne zutun des Benutzers starten (also nicht "onPress" bzw "onRelease" sondern "on?")? Ich hätte es mit "onLoad" versucht, aber irgendwie will das nicht so, wie ich will... :(
  • Ich kriege es nicht gebacken, dass ich den Preloader einbinde, und dann auf nicht sichtbar schalte. Ich erstelle einen leeren mc mit "createEmptyMovieClip", positioniere diesen und lade mit "loadMovie" einen Film ein. Dann stelle ich "_visible = false" ein, das Ding bleibt trotzdem sichtbar?

So, das wäre für's erste mal die grösste Wissenslücke, ich hoffe, es erbarmt sich jemand meines Unwissens :)

Danke schonmal!

Gruss Bud
 
Zuletzt bearbeitet:
Hallo!?

Niemand da, der mir das beantworten könnte? Oder ist die Frage so einfach, das man sie gar nciht hätte stellen dürfen? Wenn ja, dann bitte einen kurzen Hinweis wo ich eine Antwort finde.

Danke! :)
 
Niemand da, der mir das beantworten könnte?
nun, im Prinzip schon - mit mir und den Tutorials von anderen ist es bloß so eine Sache: 1. sollte man dem Tutorialurheber die Gelegenheit geben, zu antworten - und 2. muss ich mich immer ein wenig überwinden, wenn es darum geht, die Scripte anderer anzupassen (was nicht heißen soll, dass das Tutorial nicht auch hilfreich für mich war... ;) ).

Zu 1: Ich würde für diesen Zweck eine zweite Instanz des Preloaders (Instanzname "mainloader") in den ersten Frame setzen und ihm (auf der Hauptzeitleiste) folgendes Script verpassen:
PHP:
    stop();
    this.onEnterFrame = function() {
        geladen = this.getBytesLoaded();
        zuladen = this.getBytesTotal();
        if (geladen>=10) {
            prozent = Math.round(geladen/zuladen*100);
            mainloader.prozentanzeige.text = prozent+" Prozent geladen";
            mainloader.balken._xscale = prozent;
            if (prozent>=100) {
                gotoAndPlay(2); // wenn ab Frame 2 der Film beginnt
                delete this.onEnterFrame;
            }
        }
    };
};

Zu 2: Wenn onLoad-Events nicht ausreichen, tuts oft eine einmal aufgerufene onEnterFrame-Methode:
PHP:
this.onEnterFrame = function() {
    ladeziel.loadMovie("film1.swf");
    ladestatus();
    delete this.onEnterFrame;
}

Zu 3: Wann genau setzt Du die _visible Eigenschaft? Wenn ein Film eingeladen wird, werden viele Eigenschaften des Containers überschrieben (auch die _visible-Eigenschaft). Halte den Container am besten direkt in der onEnterFrame-Methode des Loaders unsichtbar.

Gruß
.
 
Hallo Datic!

Vielen Dank für Deine Hilfe! Wenn das natürlich so ist, dann können wir das auch am konkreten Beispiel machen. Ich dachte, es wäre einfacher, das auf das Tut zu beziehen. :)

Nun denn, ich hab mal versucht, Deine Ratschläge umzusetzen, auf dem Weg war ich auch schon unterwegs, leider hab ich nicht wirklich Ahnung, und deshalb will's auch nicht so recht klappen.. :(

Hier der Code:
PHP:
// ----- erstellen, positionieren und unsichtbar machen preloader_mc -----
this.createEmptyMovieClip("preloader_mc", 10);
preloader_mc.loadMovie("preloader.swf");
preloader_mc._x = 229;
preloader_mc._y = 200;
this.onEnterFrame = function(){
	preloader_mc._visible = false;
};
// --------------------------------------------------

// ----- erstellen und positionieren Navigation -----
this.createEmptyMovieClip("navigation_mc", 20);
navigation_mc._x = 0;
navigation_mc._y = 0;
navigation_mc.loadMovie("navigation.swf");
// --------------------------------------------------

// ----- erstellen und positionieren standard MC ----
this.createEmptyMovieClip("standard_mc", 5);
standard_mc._x = 0;
standard_mc._y = 0;
// --------------------------------------------------

// ----- home einladen ----------------
standard_mc.onEnterFrame = function(){
	loaded = this.getBytesLoaded();
	toload = this.getBytesTotal();
	this.loadMovie("home.swf");
	loadstat();
	if (loaded >= toload){
		this.gotoAndPlay("start");
		delete this.onEnterFrame;
	}
};
// --------------------------------------------------

// ----- Preloader ----------------------------------
loadstat = function () {
	preloader_mc.onEnterFrame = function() {
		loadedSt = _root.standard_mc.getBytesLoaded();
		toloadSt = _root.standard_mc.getBytesTotal();
		loadedMa = _root.getBytesLoaded();
		toloadMa = _root.getBytesTotal();
		loaded = loadedSt + loadedMa;
		toload = toloadSt + toloadMa;
		if (loaded>=10) {
			preloader_mc._visible = true;
			percent = Math.round(loaded/toload*100);
			this.percentText.text = percent+"%";
			this.balken._xscale = percent;
			if (percent>=100) {
				delete this.onEnterFrame;
				this._visible = false;
			}
		}
	};
};
// --------------------------------------------------

Mein Problem: Der Preloader schaltet sich partout nicht ein. Noch gar keine Rede davon, dass ich das auch gerne für den Hauptfilm integrieren würde, nicht mal bei "home.swf" will er.

Vielen Dank schonmal für's drüber schauen.

Gruss
 
Nur mal so beim kurz drüberfliegen (siehe Kommentarte)
PHP:
...
standard_mc.onEnterFrame = function(){
    loaded = this.getBytesLoaded();
    toload = this.getBytesTotal();
    this.loadMovie("home.swf");
    loadstat(); // <- hier startest du eine Funktion ...
    if (loaded >= toload){
        this.gotoAndPlay("start");
        delete this.onEnterFrame;
    }
};
// --------------------------------------------------

// ----- Preloader ----------------------------------
loadstat = function () { // <- ... die hier einige Zeilen später erst "bekannt" ist
    preloader_mc.onEnterFrame = function() {
        loadedSt = _root.standard_mc.getBytesLoaded();
        toloadSt = _root.standard_mc.getBytesTotal(); 
...
Scripts werden von oben nach unten abgearbeitet.
Soll also eine Funktion automatisch ausgelöst werden, darf der Aufruf erst _nach_ der Funktion stehen.

Das auch generell zu deiner zweiten Frage
Beim Laden per Buttons, wie im Tutorial (kaum einer klickt Millisekunden nachdem der Film da ist drauf ;)) ist das Script schon durch"gelesen", also schon bekannt.
Hab aber dennoch das Tut-Script mal geändert, also die Button-Aktionen nach hinten gestellt, um zukünftig diese Missverständnisquelle zu vermeiden.


Zu deiner ersten:
In der Tat bezieht sich das Script auf den Movieclip, in den die externen Filme geladen werden.
Möchtest du den Preloader für verschiedene Ziele nutzen, so mußt du die Pfadangabe zu der Zeitleiste, deren Ladezustand abgefragt wird, variabel halten, also theoretisch statt
PHP:
geladen = _root.ladeziel.getBytesLoaded();
dann
PHP:
geladen = _root[variablefuerdenpfadzurzeitleiste].getBytesLoaded();
... ungetestet.
Vermutlich ist es jedoch simpler, dem Hauptfilm einen separaten Preloader zu verpassen.

Zur dritten hat datic ja schon das wahrscheinlichste Problem geschildert.

Gruß
Rena

PS: @datic ... nur keine Scheu zwecks dem Tutorial. Passt an, ändert, sagt, dass es nicht wirklich passt, antwortet wie ihr mögt. Bin da relativ leidenschaftslos und wenn's dann tut oder damit gar erweitert/optimiert wird - ist doch prima. :)

PPS: @Budman ...
Nur falls das eine Fehlerquelle sein sollte ... hinzugeladene Filme werden _offline_ generell nicht von einem Preloader erfasst. Ich nehm aber an du testest das online und leerst immer schön den Cache zwischendurch. :)
 
Rena hat gesagt.:
hinzugeladene Filme werden _offline_ generell nicht von einem Preloader erfasst.
Dazu gibts die nette Funktion "Download simulieren" in der Flashvorschau. Die ist zwar bei der MovieClipLoader-Klasse zickig, aber mit loadMovie und getBytesLoaded versieht sie problemlos ihren Dienst. ;-)

Gruß
.
 
Ah .. stimmt, jetzt wo du es sagst.
Hab ich irgendwann mal gelesen, dass das ab MX 2004 wohl möglich ist und darum geht es hier ja.
Mein Fehler, sorry - hab nur MX weil beschlossen zu "überspringen". ;)

Grüße
Rena :)
 
Huch... irgendwie doch mein Fehler: Ich dachte, das wäre schon unter MX genauso gewesen (Streaming anzeigen) - aber jetzt habe ich gemerkt, dass nachgeladene Filme sofort angezeigt werden...

Gruß
.
 
Hallo und vielen Dank für die Hilfe!

@rena
Scripts werden von oben nach unten abgearbeitet.
Soll also eine Funktion automatisch ausgelöst werden, darf der Aufruf erst _nach_ der Funktion stehen.
Ja, ich hatte das aus lauter Verzweiflung mal anders rum probiert, nachdem ich irgendwo in den Einstellungen etwas entdeckt hatte, was sinngemäß "...von unten nach oben..." lautete, und deshalb hatte ich das probiert.

Nur falls das eine Fehlerquelle sein sollte ... hinzugeladene Filme werden _offline_ generell nicht von einem Preloader erfasst. Ich nehm aber an du testest das online und leerst immer schön den Cache zwischendurch.
Oh ja, wenn sich irgendwann mal ein Netzwerkadmin die ServerLogs anschaut, erklärt er mich sowieso für total daneben... :)

Ich bin mittlerweilen auch um einiges schlauer, die Idee mit der Variablen war Gold wert! Es funktioniert nun zwar einigermaßen, was mir hingegen ein Problem bereit ist das warum?

Ich hab folgendes gemacht:

Die Scripte auf drei verschiedene Frames aufgeteilt, und nun geht's. Das kann ja aber eigentlich nicht Sinn der Sache sein, oder? Hier nun das Script der ersten Bilder:
PHP:
// ----- Frame 1 ---------------------------------
function mainload(mcName) {
	_root.mainloader_mc.onEnterFrame = function() {
		loaded = _root[mcName].getBytesLoaded();
		toload = _root[mcName].getBytesTotal();
		if (loaded>=10) {
			_root.mainloader_mc._visible = true;
			percent = Math.round(loaded/toload*100);
			this.percentText.text = percent+"%";
			this.balken._xscale = percent;
			if (percent>=100) {
				delete this.onEnterFrame;
				this._visible = false;
			}
		}
	};
};
PHP:
// ----- Preloader setzt nach komplettem Laden den Hauptfilm ein Frame vor ---
// ----- warten auf preloader -----------------------
stop();
// ----- erstellen + positionieren mainloader_mc ----
this.createEmptyMovieClip("mainloader_mc", 10);
mainloader_mc.loadMovie("preloader.swf");
mainloader_mc._x = 229;
mainloader_mc._y = 200;
// ----- mainloader unsichtbar ----------------------
_root.mainloader_mc.onEnterFrame = function() {
	this._visible = false;
};
// ----- erstellen und positionieren Navigation -----
this.createEmptyMovieClip("navigation_mc", 20);
// ----- erstellen und positionieren standard MC ----
this.createEmptyMovieClip("standard_mc", 5);
// --------------------------------------------------
PHP:
stop();
navigation_mc.onEnterFrame = function (){
	loaded = _root.navigation_mc.getBytesLoaded();
	toload = _root.navigation_mc.getBytesTotal();
	this.loadMovie("navigation.swf");
	mainload("navigation_mc");
	if (loaded>=toload){
		delete this.onEnterFrame;
	}
};

Nun stellt sich mir die frage, warum das alles nicht funktioniert, wenn ich es auf ein Bild setze, und wie ich vor allem das fertige Laden ermittle. Mit getBytesLoaded/Total ist das zu ungenau, da startet er zu früh wieder los....

Danke aber nochmal für die Hilfe, es hat mich auf die richtige Spur gebracht.

Gruss
 

Neue Beiträge

Zurück