MC Farben anhand von Events ändern...

SonMiko

Erfahrenes Mitglied
Hallo zusammen,

Ich habe einen kleinen Film gemacht, wo in einm Movieclip (nennen wir ihn mal MCB) ein Bild hinterlegt ist. Auf der Hauptbühne habe ich diesen MC dann abgelegt.
Wenn man nun auf den MC klickt kann man unten in einem Menu Eigenschaftem die das Aussehen und so auch die Farben des Films bestimmen (Color: None, Brightness, Tint, Alpha und Advanced). Ich würde gerne wissen wie ich diesen Clip anhand von AS mit dem "Advanced" Effekt modifizieren kann, also das ich beispielsweise die Farben ändere und den Rot Bereich auf 255 setze oder so ähnlich...

Kann mir dazu jemand einen Rat geben oder ein AS machen, nur als beispiel?


Besten Dank und Grüße an alle,


Mike
 
Hi,

das machst Du mit dem Color-Objekt und seiner setTransform-Methde (siehe die Flashhilfe, da wird es genauer beschrieben). Beispiel:
Code:
var cl = new Color(mein_mc);
var tr = cl.getTransform(); // momentane Transf. holen
tr.rb = 255; // Rot (relativ)
tr.gb = 50; // Grün (relativ)
tr.bb = -255; // Blau (relativ);
cl.setTransform(tr);
Mit den Eigenschaften ra, ga und ba legst Du die absoluten Farbanteile fest.

Gruß
.
 
Oh oh oh...
Das passt meinem Flash aber ganz und garnicht...

Sieh mal was der Debugger ausspuckt...

Code:
**Error** Scene=menu, layer=hintergrund dynamisch, frame=1:Line 1: Statement must appear within on/onClipEvent handler
     var cl = new Color(_root.hintergrundbild);

**Error** Scene=menu, layer=hintergrund dynamisch, frame=1:Line 2: Statement must appear within on/onClipEvent handler
     var tr = cl.getTransform(); // momentane Transf. holen

**Error** Scene=menu, layer=hintergrund dynamisch, frame=1:Line 3: Statement must appear within on/onClipEvent handler
     tr.rb = 255; // Rot (relativ)

**Error** Scene=menu, layer=hintergrund dynamisch, frame=1:Line 4: Statement must appear within on/onClipEvent handler
     tr.gb = 50; // Grün (relativ)

**Error** Scene=menu, layer=hintergrund dynamisch, frame=1:Line 5: Statement must appear within on/onClipEvent handler
     tr.bb = -255; // Blau (relativ);

**Error** Scene=menu, layer=hintergrund dynamisch, frame=1:Line 6: Statement must appear within on/onClipEvent handler
     cl.setTransform(tr);

Total ActionScript Errors: 6 	 Reported Errors: 6
 
Oh mist mein Fehler!
Hatte das AS dem MC direkt zugewiesen
Da hätte ich anders adressieren müssen, richtig?
Mit "this"...

Super! Wenn ich jetzt Buttons habe, die allerdings in weiteren MCs versteckt sind,
und ich klicke auf diese Buttons, dann möchte ich die Farbe des MCs verändern, wie mache ich das dann?
Einfach "on (press) {
}" davor?
 
Wow klappt! Bin platt!
Danke vielen Dank
Jetzt meine letzte Frage, wenn ich nun möchte das immer wenn ich klicke die Farbe nicht sofort kommt sondern gefadet wird, wie sieht dann der AS vom Button aus?
 
Hi,

ich verwende in den meisten meiner Filme folgende kleinen Prototypes, denen Du Werte für rb, gb, bb, ab (alpha) und die Geschwindigkeit übergeben kannst:
Code:
// Irgendwo auf der Hauptzeitleiste:
MovieClip.prototype.setTo = function(r, g, b, a) {
	var cl = new Color(this);
	var tr = cl.getTransform();
	if (r == undefined) r = tr.rb;
	if (g == undefined) g = tr.gb;
	if (b == undefined) b = tr.bb;
	if (a == undefined) a = tr.ab;
	tr.rb = r;
	tr.gb = g;
	tr.bb = b;
	tr.ab = a;
	cl.setTransform(tr);
}

MovieClip.prototype.fadeTo = function(acc, r, g, b, a, carrier, callback) {
	if (carrier == undefined) carrier = this;
	var tgt = this;
	var cl = new Color(this);
	var tr = cl.getTransform();
	if (r == undefined) r = tr.rb;
	if (g == undefined) g = tr.gb;
	if (b == undefined) b = tr.bb;
	if (a == undefined) a = tr.ab;
	carrier.onEnterFrame = function() {
		tr.rb += (r - tr.rb) / acc;
		tr.gb += (g - tr.gb) / acc;
		tr.bb += (b - tr.bb) / acc;
		tr.ab += (a - tr.ab) / acc;
		var o_r = Math.abs(r - tr.rb);
		var o_g = Math.abs(g - tr.gb);
		var o_b = Math.abs(b - tr.bb);
		var o_a = Math.abs(a - tr.ab);
		cl.setTransform(tr);
		if (o_r < 1 && o_g < 1 && o_b < 1 && o_a < 1) {
			tr.rb = r;
			tr.gb = g;
			tr.bb = b;
			tr.ab = a;
			cl.setTransform(tr);
			delete this.onEnterFrame;
			callback(tgt);
		}
	}
}
Die Funktion setTo setzt einen Clip direkt auf die angegebenen Farbwerte, die Funktion fadeTo erzeugt ein Fading. Der Zielclip wird normalerweise selbst für die onEnterFrame-Methode verwendet - läuft da schon was, das Du nicht unterbrechen willst, kannst Du als "carrier" einen anderen MC angeben, auf dem die onEnterFrame laufen soll. Zudem kannst Du eine Rückruffunktion (callback) angeben, die nach dem Fading mit einer Referenz auf den Zielclip aufgerufen wird. Damit kannst Du auf das Ende einer Transformation reagieren.

Beispielaufruf:
Code:
function onTransform(obj) {
    trace(obj + " hat das Fading beendet");
}

mein_mc.fadeTo(50, 100, -150, 0, undefined, onTransform);

Gruß

EDIT: Callback und Delete vertauscht, damit sich Fadings mit selbem Carrier aneinander reihen lassen. ;)
.
 
Zuletzt bearbeitet:
Hi, genau die Antwort hast du schonmal jemandem gegeben...

Das sieht ja jetzt richtig geil aus! Hatte die Antwort gefunden kurz bevor du es mir gesendet hattest! Es ! Dank dir...


Besten Gruß,


Mike
 
Jupp, mag sein. :) ... aber in diesem Fall ging es schneller, das Ding noch einmal fix zu kopieren (zumal ich sehr unterschiedliche Versionen von "fadeTo" geschrieben und wohl auch gepostet habe).

Gruß
.
 
Zurück