Erklärung Gesucht: Movieclip generierung per Actionscript

Also direkt nach der Schleife für das importieren der Movieclips hab ich noch eine Schleife für das Ausrichten und Skalieren der Bilder hinzugefügt. Hier mein Code:
PHP:
 /*********************
 * Variablen		  *
 **********************/
 
 // Bilder laden //
 bild = new Array();
 bild[0] = "bild1.jpg";
 bild[1] = "bild2.jpg";
 bild[2] = "bild3.jpg";
 
 // Anzahl der Bilder //
 anzahl = bild.length;
 
 // Zähler für die Bilder // 
 var current = anzahl-1;
 
 // Maximalgrößen //
 var maxw = this._height - 10;
 var maxh = this._width - 10;
 
 var cx = this._width / 2;
 var cy = this._height / 2;
 /*********************
 * Funktionen		 *
 **********************/
 
 // Fade in funktion //
 function fadein(mc) {
 	// Alpha erhöhen //
 	if(mc._alpha < 100) {
 		mc._alpha += 1;
 	}
 	// Fade in beenden //
 	else {
 		mc._alpha = 100;
 		clearInterval(fade_in);
 	}
 }
 // Fade out funktion //
 function fadeout(mc) {
 	// Alpha erhöhen //
 	if(mc._alpha > 0 ) {
 		mc._alpha -= 1;
 	}
 	// Fade in beenden //
 	else {
 		mc._alpha = 0;
 		clearInterval(fade_out);
 	}
 }
 
 function animation() {
 	// Vorheriges bild ausblenden //
 	fade_out = setInterval(fadeout, 10, _root["bilder" + current]);
 	// ID des nächsten Bildes // 
 	naechtes = current+1;
 	// Wenn die ID nicht vorhanden ist (über der Anzahl der bilder) //
 	if (naechtes >= bild.length) {
 		// Ist das nächste wieder die ID 0 //
 		naechtes = 0;	
 	}
 	// Das nächste bild einfaden // 
 	fade_in = setInterval(fadein, 10, _root["bilder" + naechtes]);
 	// Zähler hochzählen //
 	current++;	
 	// Zähler über der Anzahl der Bilder //
 	if (current >= bild.length) {
 		// ist der Zähler 0 //
 		current = 0;
 	}
 }
 
 
 /*********************
 * Hauptprogramm	  *
 **********************/
 
 // Movieclips erstellen //
 for(var i = 0; i<anzahl; i++) {
 	this.createEmptyMovieClip("bilder" + i, i);
 	this["bilder" + i].loadMovie(bild[i]);
 	this["bilder" + i]._alpha = 0;
 }
 
 // Größen anpassen und Bilder ausrichten //
 for(var i = 0; i<anzahl; i++) {
 	r = this["bilder" + i]._width / this["bilder" + i]._height;
 	hr = this["bilder" + i]._width / maxw;
 	vr = this["bilder" + i]._height / maxh;
 	
 	if (hr > vr) {
 		this["bilder" + i]._width = maxw;
 		this["bilder" + i]._height = mc._width / r;
 	} 
 	else {
 		this["bilder" + i]._height = maxh;
 		this["bilder" + i]._width = mc._height * r;
 	}
 	this["bilder" + i]._x = cx - this["bilder" + i]._width / 2;
 	this["bilder" + i]._y = cy - this["bilder" + i]._height / 2;
 }
 
 // 1.. Aufruf //
 animation();
 
 // Slideshow starten // 
 fade = setInterval(animation, 5000);
 
Code:
   ...
for(var i = 0; i<anzahl; i++) {
     this.createEmptyMovieClip("bilder" + i, i);
     this["bilder" + i].loadMovie(bild[i]);
     this["bilder" + i]._alpha = 0;
 }
 
 // Größen anpassen und Bilder ausrichten //
 for(var i = 0; i<anzahl; i++) {
     r = this["bilder" + i]._width / this["bilder" + i]._height;
     hr = this["bilder" + i]._width / maxw;
     vr = this["bilder" + i]._height / maxh;
   ...
Wo, bitte, wartest Du denn da auf das Laden der Bilder? Direkt nach der loadMovie-Aktion versuchst Du, die Maße abzufragen. Du musst z.B. mit einer onEnterFrfame-Methode, die den MC mit getBytesLoaded oder den _width- und _height-Eigenschaften abfragt, so lange warten, bis diese Werte zur Verfügung stehen.

Gruß

P.S.: Dein "_alpha = 0" wird auch keine Auswirkung haben, da nach dem Laden alle Eigenschaften des Containers zurückgesetzt werden.
.
 
Irgendwie Raff ich das ganze nicht :(. Ich hab jetzt ne Funktion hinzugefügt die überprüft ob getBytesLoaded mit getBytesTotal übereinstimmt. Jedoch wenn ich mich über trace diese Werte ausgeben lasse bekomme ich sinnlose Ergebnisse. Ich bekomme die Meldung dass getBytesTotal -1 ist und getBytesLoaded 0. Wenn ich ein bisschen warte werden die Bilder im Hintergrund geladen und dann angezeigt. Und der ganze aufwand nur für eine Diashow auf der eigenen HP.:(

PHP:
/*********************
* Variablen		  *
**********************/

// Bilder laden //
bild = new Array();
bild[0] = "bild1.jpg";
bild[1] = "bild2.jpg";
bild[2] = "bild3.jpg";

// Anzahl der Bilder //
anzahl = bild.length;

// Zähler für die Bilder // 
var current = anzahl-1;
var zaehler = 0;

// Maximalgrößen //
var maxw = this._height - 10;
var maxh = this._width - 10;

var cx = this._width / 2;
var cy = this._height / 2;

/*********************
* Funktionen		 *
**********************/

// Fade in funktion //
function fadein(mc) {
	// Alpha erhöhen //
	if(mc._alpha < 100) {
		mc._alpha += 1;
	}
	// Fade in beenden //
	else {
		mc._alpha = 100;
		clearInterval(fade_in);
	}
}
// Fade out funktion //
function fadeout(mc) {
	// Alpha erhöhen //
	if(mc._alpha > 0 ) {
		mc._alpha -= 1;
	}
	// Fade in beenden //
	else {
		mc._alpha = 0;
		clearInterval(fade_out);
	}
}

function animation() {
	// Vorheriges bild ausblenden //
	fade_out = setInterval(fadeout, 7, _root["bilder" + current]);
	// ID des nächsten Bildes // 
	naechtes = current+1;
	// Wenn die ID nicht vorhanden ist (über der Anzahl der bilder) //
	if (naechtes >= bild.length) {
		// Ist das nächste wieder die ID 0 //
		naechtes = 0;	
	}
	// Das nächste bild einfaden // 
	fade_in = setInterval(fadein, 12, _root["bilder" + naechtes]);
	// Zähler hochzählen //
	current++;	
	// Zähler über der Anzahl der Bilder //
	if (current >= bild.length) {
		// ist der Zähler 0 //
		current = 0;
	}
}

function check_Loaded() {
	for(var i=0; i<anzahl; i++) {
		trace(_root["bilder" + i].getBytesLoaded() + " / " + _root["bilder" + i].getBytesTotal());
		if((_root["bilder" + i].getBytesTotal() == _root["bilder" + i].getBytesLoaded()) && _root["bilder" + i].getBytesTotal() > 0) {
			zaehler += 1;
			trace(zaehler);
		}
		if(zaehler == anzahl) {
			// Interval löschen //
			clearInterval(checkLoaded);
			// 1. Aufruf //
			animation();			
			// Slideshow starten // 
			fade = setInterval(animation, 5000); 
		}
	}
}

/*********************
* Hauptprogramm	  *
**********************/

// Movieclips erstellen //
for(var i = 0; i<anzahl; i++) {
	this.createEmptyMovieClip("bilder" + i, i);
	this["bilder" + i].loadMovie(bild[i]);
	this["bilder" + i]._alpha = 0;
}

checkLoaded = setInterval(check_Loaded, 10);
 
Hi,

ich würde es folgendermaßen angehen:
  • Erstelle einen MovieClip als Bildcontainer, der die Methode zum Vorladen und Skalieren der Bilder selbst mitbringt.

  • Die Bilder selber werden dann in einen weiteren (leeren) Container innerhalb dieses MC geladen

  • Was Du auf der Hauptzeitleiste machst, wäre dann folgendes:
    • Instanziere n Exemplare des Container-Clips und weise ihnen jeweils einen Pfad zu dem entsprechenden Bild zu
    • Die Container warten per onEnterFrame bzw. setInterval darauf, dass ihnen ein Pfad zugewiesen sind, laden dann das Bild und skalieren es, sobald die _width- und _height-Eigenschaften des inneren Containers nicht mehr 0 sind. Die Container können sich mit _visible = false bis zu diesem Zeitpunkt selbst unsichtbar halten.
    • Das Ein- und Ausfaden löst Du dann wie bisher, indem Du die einzelnen Container gegeneinander blendest.

Gruß
.
 
Tobias Menzel hat gesagt.:
Hi,

ich würde es folgendermaßen angehen:

  • Erstelle einen MovieClip als Bildcontainer, der die Methode zum Vorladen und Skalieren der Bilder selbst mitbringt.
  • Die Bilder selber werden dann in einen weiteren (leeren) Container innerhalb dieses MC geladen
  • Was Du auf der Hauptzeitleiste machst, wäre dann folgendes:
    • Instanziere n Exemplare des Container-Clips und weise ihnen jeweils einen Pfad zu dem entsprechenden Bild zu
    • Die Container warten per onEnterFrame bzw. setInterval darauf, dass ihnen ein Pfad zugewiesen sind, laden dann das Bild und skalieren es, sobald die _width- und _height-Eigenschaften des inneren Containers nicht mehr 0 sind. Die Container können sich mit _visible = false bis zu diesem Zeitpunkt selbst unsichtbar halten.
    • Das Ein- und Ausfaden löst Du dann wie bisher, indem Du die einzelnen Container gegeneinander blendest.
Gruß
.

Gut danke, die Idee hab ich kapiert. Nur 1 Sache kapier ich noch nicht ganz:
" Die Container warten per onEnterFrame bzw. setInterval darauf, dass ihnen ein Pfad zugewiesen sind,"
Was für ein Pfad und warum warten sie auf einen Pfad?

(langsam komm ich mich blöd vor weil ich wirklich nix check :( )

mfg daniel
 
Hi,

Die Container müssen ja wissen, welches Bild sie laden sollen. Ich löse das meistens so:

Code im Container-MC:
Code:
this._visible = false;

this.onEnterFrame = function() {
    if (_image != undefined) {
        pic_container.loadMovie(_image);
        preload();
    }
}

function preload() {
    this.onEnterFrame = function() {
        var max = pic_container.getBytesLoaded();
        var max = pic_container.getBytesTotal();
        // usw. Vorladen und dann anzeigen ;)

Und auf der Hauptzeitleiste etwas in der Art:
Code:
var bilder = new Array("images/pic1.jpg", "images/pic2.jpg");
var picture = new Array();

for (var i=0; i<bilder.length; i++) {
    picture[i] = this.attachMovie("container", "ct" + i, i);
    picture[i]._image = bilder[i];
}

Variablen kann man eigentlich eleganter mit "watch" überwachen; diese Methode greift allerdings erst nach mindestens einem Frameaufruf, daher begnüge ich mich meistens mit onEnterFrame. ;)

Gruß
.
 
Gut, Danke jetzt weiß ich wie du das meinst. Nur happerts jetzt beim Vorladen. Ich hab mir vorerst gedacht ich mach noch keine Ladeanzeige sondern lass mir die Bytes per trace ausgeben. Nur das Bild wird überhaupt nicht geladen. Die BytesTotal und BytesLoaded bleiben beide auf 0. Hab mal die Datei angehängt.

mfg daniel
 

Anhänge

  • diashow.zip
    9,1 KB · Aufrufe: 26
Hi,

was Du nun machst, ist, das Bild immer wieder zu laden (mit jedem Frameaufruf) - daher wird getBytesLoaded auch niemals anwachsen.

Probier es mal so:
Code:
this._visible = false;


this.onEnterFrame = function() {
    if (_image != undefined) {
	// Bild laden
	pic_container.loadMovie(_image);
	preload();
    }
}

function preload() {
	// neue onEnterFrame-Methode definieren:
	this.onEnterFrame = function() {
		var geladen = pic_container.getBytesLoaded();
		var zuladen = pic_container.getBytesTotal();
		if (geladen > 0 && zuladen > 0) {
			var prozent = geladen * 100 / zuladen;
			trace(geladen + " / " + zuladen + " -> " + prozent + "%");
			if (prozent >= 100) {
				// warum einen neuen Clip mit dem Bild erstellen,
				// wenn ich diesen einfach anzeigen kann?
				this._visible = true;
			}
		}
	}
}

Gruß
.
 
Achso ist das. Ne kleine Frage. Warum werden die Bilder automatisch auf eine extrem hohe Breite skaliert? Es ist bereits bei der vorherigen Datei der Fall. Sobald ich ein Bild lade und dann sichtbar stelle hat der Movieclip eine Breite von 40000 oder so und lässt sich dadurch nicht ordenlich anpassen. Dabei verändere ich ja nirgends die Größe.
mfg daniel
 

Neue Beiträge

Zurück