Banner hilfe

BSA

Erfahrenes Mitglied
Hi Leute!

Ich benutze ein fertiges Script, welches ich hier im Forum gefunden hab.
Jetzt würde ich das gernen noch ein bisschen Anpassen, es wäre nett wenn mir einer helfen kann, da ich leider keine Ahnung habe von Flash.

Erstmal der Code:

Code:
var pic = new Array();
var current = 0;
var loaded = 0;
var IV = 0;
var centerX = 296;
// Mittelpunkt der Bühne!
var centerY = 57.5;
var timeout = 6000;
// Zeit zwischen den Bildern!
var xm = new XML();
xm.ignoreWhite = true;
xm.load("banner.txt");
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)/6;
				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)/15;
				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);
}

Jetzt möchte ich das wenn man das Aufruft nicht erst ein Bild geladen wird, sondern das schon da ist, und dann erst zum nächsten "überfaded". Das hat bestimmt was mit createEmptyMovieClip zu tun, richtig?!

Und dann würde ich gerne die Alphablendungen etwas länger ziehen, also das nicht so abruppt machen. Beispiel gibts hier:

http://icespeedskater.de/fila/

Also wenn ich auf nen neuen Link klicken, soll er das auch nicht immer so abruppt laden, sondern am besten überblenden.

Würde mich über Hilfreiche Tipps freuen.

Gruß
 
Also,

für das überfade Tempo musst du nur die Zeile :
this._alpha += (100-this._alpha)/6;
anpassen.
Um das erste Element schon auf der Bühne zu haben, musst du es entweder in die Fla integrieren, oder den Ladeprozess ändern, für beides solltest du das ganze file posten.

B
 
Zum direkten Anzeigen des ersten geladenen Bildes, modifiziere die Funktion "nextLoaded" folgendermaßen:
PHP:
function nextLoaded() {
	if (loaded == 0) {
		pic[0].go();
		current = 0;
	}
	loaded++;
	if (loaded>=pic.length) {
		nextPic(0);
	}
}

Gruß
.
 
Hallo :)
Ich weiß, man gräbt normalerweise keine Threads wieder aus, aber warum sollte ich das Rad neu erfinden, wo meine Frage sich genau auf diesen Thread bezieht:

Mein Code (selber wie oben eigentlich):
PHP:
var pic = new Array();
var current = 0;
var loaded = 0;
var IV = 0;

var centerX = 283; // Mittelpunkt der Bühne!
var centerY = 83;

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

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

xm.load("header.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) / 6;  // dauer des einblendens
				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) / 6; // dauer des ausblendens
				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);
}

Mein Problem bezieht sich auf die Zeit, die von mir geändert wurde:
6; // dauer des einblendens
6; // dauer des ausblendens
im Code ersichtlich -> mit der Zahl 6 ist es mir nämlich noch immer zu schnell, höhere (ab 7) enden in einem nicht-fadenden Bild. Es faded einmal ein und bleibt so, ohne dass es in der Schleife weiterwandert.

Das Ziel sollten 1,5 - 2 Sec pro Fade sein, da es der Header für eine ruhige Seite sein soll.

Hoffe mir kann wer helfen :)
Danke, Max


EDIT: erledigt!
Problem war - die var timeout Zeit war zu gering um ein langsameres Fading zu ermöglichen - habe die Zeit erhöht (auf 6000) und konnte dann auch das Fading verlangsamen.
 
Zuletzt bearbeitet:
Ich bins nochmal, dachte das Problem wäre gelöst, ist es aber nicht.

Eine Eigenart hat das Ding nämlich noch - es gibt 2 Variablen die ich hier ändern kann um das Ein/Ausblenden zu steuern. Der erste Wert darf aber nicht höher als 6 gesetzt werden, denn sonst läuft es sogar mit 7 Sekunden zwischen den Bildern nicht mehr. Der 2. kann hingegen ohne Probleme auch auf 25 erhöht werden - mein Wunschwert für beide, denn hier ist die Animation schön langsam.

Lasse ich den ersten auf 6 (maximum scheint es), den zweiten auf 30, kommt ein Bild langsam, das nächste schnell, dann wieder eins langsam und wieder schnell.
Hoffe das ist nachvollziehbar wie ich es meine, habe es mit dem Script vom Threadersteller auch probiert - selbes Problem (also doch identisches Script).

PHP:
var pic = new Array(); 
var current = 0; 
var loaded = 0; 
var IV = 0; 

var centerX = 283; // Mittelpunkt der Bühne! 
var centerY = 83; 

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

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

xm.load("header.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) / 6;  // Wert 1 
                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) / 6; // Wert 2
                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 würde ich auch gerne das Random entfernen und die Bilder der Reihe nach einblenden lassen - randomize bringt mir zuoft die selben Bilder, obwohl noch nicht mal alle einmal eingeblendet waren.

Bitte um Hilfe!
mfg Max
 
Hi,

auf Verdacht: Vertausche mal in folgendem Block die beiden rot markierten Zeilen:
Code:
        pic[i].go = function() { // Einblenden 
            this.onEnterFrame = function() { 
                this._alpha += (100 - this._alpha) / 6;  // Wert 1 
                if (this._alpha >= 98) { 
                    this._alpha = 100; 
                    this._parent.nextPic(this.nr);
                    // ruft Funktion zum Anzeigen des 
                    // nächsten Bildes auf 
                    delete this.onEnterFrame;
                } 
            } 
        }

Gruß
.
 
Hi,

Wobei sollte das Austauschen der Zeilen helfen?
Es ist weiterhin random, falls du das gemeint hast, Fadingtime lässt sich dennoch nicht verlängern.
Habe mal das File + Bilder angehängt, für jeden der so ein Fade sucht ist es so wohl leichter zu verstehen. Und fürs Problemelösen natürlich auch.

Max

Anm zur Datei: Ich verwende natürlich nicht nur 3 sondern 8-10 Bilder.
 

Anhänge

Hi,

wahrscheinlich habe ich Dein Anliegen falsch verstanden.

In der angehängten Datei werden die Bilder m.E. immer mit der gleichen Geschwindigkeit eingeblentet.

Kannst Du Dein Problem bitte noch etwas genauer beschreien?

EDIT: Jetzt habe ich es - glaube ich - gesehen: Bei langsameren Annährungsgeschwindigkeiten tritt das angegebene Limit des Alphawertes nicht ein. Ändere die Funktionen "go" und "hold" folgendermaßen ab:
Code:
		pic[i].go = function() {
			// Einblenden
			this.onEnterFrame = function() {
				var la = this._alpha;
				this._alpha += (100 - this._alpha) / 10;
				if (Math.abs(this._alpha - la) < 0.1) {
					this._alpha = 100;
					this._parent.nextPic(this.nr);
					delete this.onEnterFrame;
				}
			};
		};
		pic[i].hold = function() {
			// Ausblenden
			this.onEnterFrame = function() {
				var la = this._alpha;
				this._alpha += (0 - this._alpha) / 8;
				if (Math.abs(this._alpha - la) < 0.1) {
					this._alpha = 0;
					delete this.onEnterFrame;
				}
			};
		};

Gruß
.
 
Zurück