Skriptproblem mit fadeIn/Out funktion

Denniz

Erfahrenes Mitglied
Ich hab mir diesen Threat angeschaut http://www.tutorials.de/forum/flash/252895-simple-galery-sliden-lassen.html
Ist eine feine sache mit dem Skript vom Tobias so das ich das ding in meine Gallerie einbauen will.
Wenn man über die einzelnen Pics geht soll das Bild verblassen und beim rollOut wieder einfaden.
Hab es bislang so angepaßt:
PHP:
function fadeOut() {
	this.onEnterFrame = function() {
		this._alpha += (0-this._alpha)/4;
		if (this._alpha<50) {
			delete this.onEnterFrame;
		}
	};
}
function fadeIn() {
	//this._alpha = 0;
	this.onEnterFrame = function() {
		this._alpha += (100-this._alpha)/4;
		if (this._alpha>99) {
			this._alpha = 100;
			delete this.onEnterFrame;
		}
	};
}

var anzahlPics = 100;
for (var i = 1; i<=anzahlPics; i++) {
	this["pic"+i+"_mc"].onRollOver = function() {
		fadeOut();
	};
}

Jetzt ist das so das wenn ich über ein Pic gehe alle Pics gleichzeitig verblassen.
Es soll aber nur das Pic verblassen über dem ich grad mit dem Mauszeiger bin.
HAb ich da wieder was mit der for Schleife falsch gemacht?
Und wir krieg ich dann beim RollOut die fadeIn function eingebaut?

-Denniz
 
Hi,

Du sprichst ja auch von "this._alpha" - und "this" verweist auf die Zeitleiste, auf der die Funktion notiert ist, nicht auf das Objekt, von wo aus sie evtl. aufgerufen wurde. Du "fadest" also Deine Hauptzeitleiste. ;)

Übergib den Funktionen eine Referenz auf das jeweilige Bild und verwende diese, um die onEnterFrame-Methode und die Alphatransparenz festzulegen:
Code:
function fadeOut(obj) {
    obj.onEnterFrame = function() { // obj ist das Bild, das übergeben wird
        this._alpha += (0-this._alpha)/4;
        if (this._alpha<50) {
            delete this.onEnterFrame;
        }
    };
}
function fadeIn(obj) {
    //this._alpha = 0;
    obj.onEnterFrame = function() {
        this._alpha += (100-this._alpha)/4;
        if (this._alpha>99) {
            this._alpha = 100;
            delete this.onEnterFrame;
        }
    };
}

var anzahlPics = 100;
for (var i = 1; i<=anzahlPics; i++) {
    this["pic"+i+"_mc"].onRollOver = function() {
        fadeOut(this); // verweist hier auf das Bild, da innerhalb onRollOver
    };
}

Gruß
.
 
Vielen Dank,
das ding ist echt gut.

Mir ist aber noch was eingefallen was ich für die Gallerie als feature noch so einbauen will.
Und zwar wenn man auf ein Pic klickt soll das Bild auf alpha=40 faden und wenn man dann ein anderes anklickt soll es sich wieder einfaden auf 100% und das angeklickte auf 40% verblassen. Und immer so weiter.
Jetzt dachte ich mir das ich beim onPress event eine Variable mitgebe und dann in der fadeIn funktion eine if abfrage mache ob die Variable true oder false ist. True ist es wenn ich ein pic anklicke. Ansonsten ists auf false.

PHP:
function fadeOut(obj) {
	obj.onEnterFrame = function() {
		this._alpha += (0-this._alpha)/4;
		if (this._alpha<50) {
			delete this.onEnterFrame;
		}
	};
}
function fadeIn(obj) {
	obj.onEnterFrame = function() {
		if (clicked == "false") {
			this._alpha += (100-this._alpha)/4;
			if (this._alpha>99) {
				this._alpha = 100;
			}
		} else {
			this._alpha = 40;
		}
	};
}
var anzahlPics = 100;
var clicked = "false";
for (var i = 1; i<=anzahlPics; i++) {
	this["pic"+i+"_mc"].onRollOver = function() {
		fadeOut(this);
	};
	this["pic"+i+"_mc"].onRollOut = function() {
		fadeIn(this);
	};
	this["pic"+i+"_mc"].onPress = function() {
		clicked = "true";
	};
}

WEnn ich auf ein Pic gehe und dort draufklicke dann bleibt das Pic auf alpha 40 aber wenn ich ein anderes Pic anklicke springts nicht wieder auf alpha 100 zurück.
Außerdem ist da noch ein anderes Problem, nämlich wenn man vorher ein rollover über die anderen Pics macht und dann eins anklickt dann werden alle Bilder uber denen man ein Rollover gemacht hat auch alpha 40%.:confused:

ACh so, fast vergessen, hab es hier hochgeladen


-Denniz
 
Na ja - Du speicherst ja nirgendwo, "welches" BIld im Moment "aktiviert" ist. Ausserdem: Wie soll das bisher aktivierte Bild wissen, wenn ein anderes angeklickt wurde, damit es wieder zum Ausgangszustand zurückkehren soll? ;)

Mein Vorschlag: Lege die nötigen Funktionen für jedes Bild an, und speichere eine Referenz auf das aktuelle Bild global:
Code:
var activeObj = null;

function activate(obj) {
    activeObj.fade(100);
    activeObj = obj;
    // activeObj.fade(40); // je nachdem, ob schon beim Klicken auf 40 gehen soll
}

for (var i = 1; i<=anzahlPics; i++) { 
    var obj = this["pic"+i+"_mc"];
    obj.fade = function(d) {
        this.onEnterFrame = function() {
            this._alpha += (d - this._alpha) / 4;
            if (Math.abs(d - this._alpha) < 1) {
                this._alpha = d;
                delete this.onEnterFrame;
            }
        }
    }
    obj.onRollOver = function() {
        this.fade(0);
    }
    obj.onRollOut = obj.onDragOut = function() {
        this.fade((this == activeObj)? 40 : 100);
    }
    obj.onRelease = function() {
        activate(this);
    }
}
(ungetestet, daher vllt. noch nicht ganz das von Dir gewünschte Verhalten)

Gruß
.
 
Hallo,

ja das ist genau das Verhalten das ich haben wolte.
Das Pic bleibt beim onRelease gefadet und wird dann wieder eingefadet wenn ich auf ein anderes Pic klicke.

Das Problem das ich jetzt habe ist das ich nicht dein Skript verstehe um es weiter zu bearbeiten
( this.fade((this == activeObj)? 40 : 100) :confused:.
Ich habe bislang soetwas: beim onRelease auf ein Vorschaupic springe ich dann zu
einem Frame im gallerie_mc wo das Bild auf der Bühne dann in groß dargestellt wird.

Mein momentanes skript:
PHP:
stop();
var anzahlPics = 100;
/*----------------------Funktionen----------------*/
function fadeOut(obj) {
	obj.onEnterFrame = function() {
		// obj ist das Bild, das übergeben wird
		this._alpha += (0-this._alpha)/10;
		if (this._alpha<80) {
			delete this.onEnterFrame;
		}
	};
}
function fadeIn(obj) {
	obj.onEnterFrame = function() {
		this._alpha += (100-this._alpha)/4;
		if (this._alpha>99) {
			this._alpha = 100;
			delete this.onEnterFrame;
		}
	};
}
for (var i = 1; i<=anzahlPics; i++) {
	this["pic"+i+"_mc"].onRollOver = function() {
		fadeOut(this);
		// verweist hier auf das Bild, da innerhalb onRollOver
	};
	this["pic"+i+"_mc"].onRollOut = function() {
		fadeIn(this);
		// verweist hier auf das Bild, da innerhalb onRollOut
	};
	this["pic"+i+"_mc"].picNumber = i;
	this["pic"+i+"_mc"].onRelease = function() {
		_parent.gallerie_mc.gotoAndStop(this.picNumber);
		trace(this.picNumber);
	};
}

Jetzt weiß ich nicht wie dieses hier
PHP:
this["pic"+i+"_mc"].picNumber = i;
	this["pic"+i+"_mc"].onRelease = function() {
		_parent.gallerie_mc.gotoAndStop(this.picNumber);
		trace(this.picNumber);
	};

in dein obiges Skript eingebaut bekomme damit ich dem die Anweisung geben kann
in den jeweiligen Frame vom gallerie_mc zu springen.


-Denniz
 
Hi,

ich kann keinen eklatanten Fehler in Deinem zusammengesetzten Script entdecken. Um Dir mit dem richtigen Ansprechen von Objekten weiterzuhelfen, müsste ich die Objektstruktur kennen (sprich: poste bitte mal die .fla).

Zu Deiner ersten Frage:
Code:
this.fade((this == activeObj)? 40 : 100;
ist das selbe wie:
Code:
if (this == activeObj) {
    this.fade(40);
} else {
    this.fade(100);
}

Gruß
.
 
Hallo Tobias,
ich habe eine testgalerie erstellt und die Fla hochgeladen.
Im ersten frame liegt mein Skript.
Dort funktioniert alles außer das die bilder beim onrelease nicht aktiviert bleiben sondern wieder einfaden.

Im zweiten Frame ist dein Skript.
Dort ist das aktivierungsproblem beim onrelease behoben allerdings wird dort nicht beim onrelease in den gallerie_mc gesprungen in dem ,auf einzelnen Frames , die Bilder in groß
liegen.

Jetzt weiß ich nicht wie ich meinen onRelease abschnitt in dein Skript einfügen kann um die Bilder zu skippen oder wie ich deine activate funktion in mein Skript eingebaut bekomme damit das Vorschaubild beim onrelease gefadet bleibt.

-Denniz
 
Ich hab die Gallerie nun etwas verändert und zwar hab ich ein fader_mc zusätzlich eingebaut der jedesmal erscheint wenn man auf ein vorschaupic klickt.
Soweit kein problem aber da sich die Vorschaubilder je nach mauszeigerposition nach rechts oder links bewegen soll der fader_mc immer über das zuvor angeklickte pic liegen und sich mitbewegen.
Die faderPosX variable müßte sich ständig in die aktuelle xPosition des zuvor angeklickten pics ändern.
Ich brache also ein dynmischen rückgabewert von diesem pic damit mein fader_mc sich mitbewegt.
Brauch ich dafür getProperty?
Ich hab keine Idee wie ich das einbauen soll.

Hier mein SKript:

PHP:
stop();
var anzahlPics:Number = 100;
var faderPosX:Number = -100;
var faderPosY:Number = -100;
function fader(obj) {
	_root.faderPosX = obj._x;
	_root.faderPosY = obj._y;
	_root.fader_mc.gotoAndPlay(1);
}
for (var i = 1; i<=anzahlPics; i++) {
	this["pic"+i+"_mc"].picNumber = i;
	this["pic"+i+"_mc"].onRelease = function() {
		_root.fader(this);
		_root.gallerie_mc.gotoAndStop(this.picNumber);
	};
}
fader_mc.onEnterFrame = function() {
	this._x = _root.faderPosX;
	this._y = _root.faderPosY;
};
slideSpeed = 0.02;
this.onEnterFrame = function() {
	currentMousex = Math.floor(this._xmouse);
	if (currentMousex>=200) {
		for (var i = 1; i<=anzahlPics; i++) {
			this["pic"+i+"_mc"]._x += 5;
		}
	} else if (currentMousex<=200) {
		for (var i = 1; i<=anzahlPics; i++) {
			this["pic"+i+"_mc"]._x -= 5;
		}
	}
};

Hier meine Gallerie

Help.

-Denniz
 
Zuletzt bearbeitet:
Hi,

Du hast zwar eine onEnterFrame-Methode laufen, die den Fader_mc laufend auf die Position von faderPosX/faderPosY setzt, aber diese beiden Variablen werden nur einmal - und zwar beim Klick auf ein Bild - gesetzt. Daher bleibt Dein Fader dort stehen, wo einmal geklickt wurde. Mein Vorschlag:
Code:
var anzahlPics:Number = 4; // 100

var slideSpeed = 0.02;

_root.fader_mc.stop(); // erstmal anhalten

function fader(obj) {
	_root.fader_mc.gotoAndPlay(1); // abspielen
	_root.fader_mc.onEnterFrame = function() { // laufend aktualisieren:
		this._x = obj._x;
		this._y = obj._y;
	}
}
for (var i = 1; i<=anzahlPics; i++) {
	this["pic"+i+"_mc"].picNumber = i;
	this["pic"+i+"_mc"].onRelease = function() {
		_root.fader(this);
		_root.gallerie_mc.gotoAndStop(this.picNumber);
	}
}

this.onEnterFrame = function() {
	currentMousex = Math.floor(this._xmouse);
	if (currentMousex>=200) {
		for (var i = 1; i<=anzahlPics; i++) {
			this["pic"+i+"_mc"]._x += 5;
		}
	} else if (currentMousex<=200) {
		for (var i = 1; i<=anzahlPics; i++) {
			this["pic"+i+"_mc"]._x -= 5;
		}
	}
}

Gruß
.
 
Zurück