dyn. ein- u. ausfaden von bilder

Hi,

darf ich fragen, wie viele Bilder Du hast? Ich habe derartiges mit ca. 30 Bildern problemlos am laufen. Folgende Schleife könnte problematisch sein:
PHP:
do {
    var v = int(Math.random() * pic.length);
} while (v == nr);
.. obwohl die Bedingung recht schnell unwahr werden sollte, da ja nur ein Index ausgeschlossen wird. Es werden in diesem Script alle Bilder vorgeladen und mit onEnterFrame-Methoden versehen, was bei sehr vielen Bildern sicher zu lasten der Systemleistung gehen kann. Es könnte auch sein, dass Du für das Ein- und Ausfagen Geschwindigkeiten gewählt hast, die nie zum Abbruch des Fadevorgangs führen. Ich würde in die go() und hold()-Funktionen der Bilder einmal eine Trace-Aktion setzen, die den Instanznamen des Bild-Clips ausgibt. Da sollten eigentlich immer nur 2 auf einmal laufen.

Für sehr grosse Galerien würde ich ein Script schreiben, dass die Bilder progressiv vorlädt (sprich: nicht alle auf einmal) und das Überblenden zentral steuert. Auch hat Flash Probleme damit, sehr viele MovieClips mit Transparenz übereinanderzulegen. u.U. wirst Du auch bei _alpha = 0 "Relikte" sehen und die Performance geht in die Knie. Setze an das Ende der Funktion "hold" (da wo this._alpha = 0 steht) zusätzlich ein "this._visible = false" und an den Anfang der Funktion "go" ein "this._visible = true".

Oder auch mal folgendes: Die Funktion "nextPic" nicht die ganze Schleife durchlaufen lassen, sondern nur das Bild mit dem letzten Index ausfaden. Dieses Script kann sicher in vielerlei Hinsicht optimiert werden; es war ja nur ein schnelles Beispiel. Wenn ich Zeit habe, poste ich vielleicht ein paar Verbesserungen.


Gruß
.
 
Zuletzt bearbeitet:
Hallo zusammen,
erstmal Danke für das großartige Script.
Nun wollte ich externe Bilder via kompletter URL einbinden (http://domain.de/....jpg), bekomm´s aber nicht hin. Das XML-File erzeuge ich zur Laufzeit via PHP und mysql. Weiß mittlerweile auch, daß es via loadMovie("*.jpg", "GET"); gehen müßte. Da meine Flash-Kenntnisse aber mehr als begrenzt sind.... :-(
Hat vielleicht jemand einen guten Tip für mich?
Danke im voraus.
Ruse
 
Hi,

was genau schlägt fehl: Das Laden von Bildern auf einem externen Server per loadMovie, oder die Übergabe der zur Laufzeit generierten XML-Daten?

Poste ggf. mal Deine Dateien (.fla, .php).

Gruß
.
 
Die Übergabe der XML-Daten paßt - wenn ich nur mit relativen Pfaden arbeite funktioniert es. Mein Problem ist, daß ich nicht weiß, wo ich "loadMovie", wie einbinden muß. Ich schätze, es solltei in die Funktion showPic(). Aber wie genau?
Mein/Euer ;-) Code:
PHP:
var pic = new Array();
var current = 0;
var loaded = 0;
var IV = 0;

var centerX = 275; // Mittelpunkt der Bühne!
var centerY = 200;

var timeout = 2000; // Zeit zwischen den Bildern!

var xm = new XML();
xm.ignoreWhite = true;

xm.load("pictures.xml");

xm.onLoad = function() {
	parse(this);
}

function parse(obj) {
	for (var i=0; i<obj.childNodes.length; i++) {
		pic[i] = this.createEmptyMovieClip("pic" + i, i + 512);
		pic[i].ct = pic[i].createEmptyMovieClip("ct", 1);
		pic[i]._alpha = 0;
		pic[i].nr = i;
		pic[i]._x = centerX;
		pic[i]._y = centerY;
		pic[i].go = function() { // Einblenden
			this.onEnterFrame = function() {
				this._alpha += (100 - this._alpha) / 4;
				if (this._alpha >= 98) {
					this._alpha = 100;
					this._parent.nextPic(this.nr);
					// ruft Funktion zum Anzeigen des
					// nächsten Bildes auf
					delete this.onEnterFrame;
				}
			}
		}
		pic[i].hold = function() { // Ausblenden
			this.onEnterFrame = function() {
				this._alpha += (0 - this._alpha) / 4;
				if (this._alpha <= 2) {
					this._alpha = 0;
					delete this.onEnterFrame;
				}
			}
		}
		pic[i].ct.loadMovie(obj.childNodes[i].attributes.picture);
		pic[i].onEnterFrame = function() {
			if (this.ct._width > 10 && this.ct._height > 10) {
				this.ct._x = -this.ct._width / 2;
				this.ct._y = -this.ct._height / 2;
				this._parent.nextLoaded();
				delete this.onEnterFrame;
			}
		}
	}
}

function showPic(nr) { // Blendet ein Bild ein
	clearInterval(IV);
	if (current != nr) {
		for (var i=0; i<pic.length; i++) {
			if (nr != i) {
				pic[i].hold();
			} else {
				pic[i].go();
				current = i;
			}
		}
	}
}

function nextLoaded() {
	loaded ++;
	if (loaded >= pic.length) randPic();
}

function nextPic(nr) { // Blendet ein zufälliges Bild verzögert ein
	clearInterval(IV);
	do {
		var v = int(Math.random() * pic.length);
	} while (v == nr);
	IV = setInterval(function() { showPic(v); }, timeout);
}

function randPic() { // Blendet ein zufälliges Bild ein
	clearInterval(IV);
	do {
		var v = int(Math.random() * pic.length);
	} while (v == current);
	showPic(v);
}
Bei der gelegenheit gleich noch eine andere Frage: Könnte ich auch etwas anderes als (z.B. *.php) ein XML-File (natürlich mit gleichem Inhalt) einbinden? Konkret: Zur Schreibe ich das XML-File via PHP in einem lokalen Cache um es dann mit obigem Script wieder auszulesen... :-( Ach ja: Das PHP-File kommt wieder von einem anderen Server.
 
Hi,

lass Dir mal nach
Code:
pic[i].ct.loadMovie(obj.childNodes[i].attributes.picture);
den Inhalt dieses Attributes ausgeben:
Code:
trace(obj.childNodes[i].attributes.picture);
Vielleicht kommen die Pfade irgendwie verstümmelt an. ;)

Mag auch sein, dass ab Flashplayer 8 keine "externen" Dateien mehr per loadMovie eingeladen werden können (in 7 gings m.E. noch). Liegen die Bilder auf einer anderen Domain als die swf? Wenn Du auf die zweite Domain Zugriff hast, könntest Du es einmal mit einer Richtliniendatei (siehe Referenz) probieren.

@andere Endung: Klar, es ist überhaupt kein Problem, die Ausgabe eines PHP-Scriptes als XML-Objekt zu parsen. ;)

Gruß
.
 
Die Pfade kommen korrekt an, allerdings bei einer URL mit Fehler:
PHP:
http://www.spiegel.de/img/0,1020,624011,00.jpg
steinbruch.jpg
sowefei.jpg
http://domain.de/get_pic.php?ID=T8d0e9ab44d78e64858895ad57c293c82
Error opening URL "http://domain.de/get_pic.php?ID=T8d0e9ab44d78e64858895ad57c293c82"
domain.de ist im Script natürlich eine funktionierende Domain. Wenn ich diese dann per copy&paste in den Browser übernehme, liefert der das bild... :-( Könnte aber mit den Header-Infos des PHP-Scripts zusammenhängen.
Aber auch ohne die potentiell fehlerhafte URL geht´s nicht. Sind beide "http://....." raus, läuft das Script wenigstens.
Entsprechend der Doku habe ich die "crossdomain.xml" angelegt:
PHP:
<cross-domain-policy>
  <allow-access-from domain="www.spiegel.de" />
</cross-domain-policy>
und in das Verzeichnis mit dem flash-file gepackt, wobei der Effekt an irgendwie nicht eintritt...
 
... umgekehrt müsstest Du die crossdomain.xml auf spiegel.de anlegen, um Zugriffe von Deiner Seite aus zu erlauben - sonst könnte man sich ja überall beliebige Berechtigungen holen. ;)

Probier mal, die URLS auf php-Seite per "urlencode" zu kodieren und in Flash vor der loadMovie-Aktion per "unescape" wieder herzustellen.

... kann aber auch sein, dass spiegel.de das externe Einbinden ihrer Grafiken verbietet.

Gruß
.
 
:-(
Ein dezentes verschieben der crossdomain.xml auf die zweite Domain hat mein Problem gelöst... Danke, Danke, Danke
 
Wäre auch zu schön gewesen. :-(
Wenn ich das SWF-File direkt aufrufe, funktioniert alles prima (auch die URL, welche lokal fehlerhaft war). Sobald ich das das swf-File aber einbette, ist es vorbei mit der Freude:
PHP:
<DIV style="position:absolute; right:25px; top:23px; width:200px; height:250px; z-index:2;">

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0" width="200" height="200">
    <param name="movie" value="http://www.domain.de/cms/flash/randomgal.swf">
    <param name="quality" value="high">
     <PARAM NAME=menu VALUE=false>
      <PARAM NAME=quality VALUE=best>
       <PARAM NAME=wmode VALUE=transparent>
       
    <embed src="http://www.domain.de/cms/flash/randomgal.swf" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash"
      menu=false
        quality=best
	  wmode=transparent
	    bgcolor=#ffffff
	     width="200" height="200"></embed>
</object>

</DIV>
Könnte es an der Base-Direktive im Head der Seite liegen?
PHP:
<base href="http://www.domain.de/seiten/">
 
Hi,

liegt nun die swf- Datei auch auf einem anderen Server als die html-Seite? m.E. musst Du in der crossdomain.xml die Domain der Seite angeben, in der die Flashdatei eingebettet ist, egal, auf welchem Ort sie sich physikalisch befindet.

Gruß
.
 
Zurück