as syntax - längsstrich

harrry

Erfahrenes Mitglied
Hallo, ich habe in einem Script das da:
PHP:
farbWechsel.setRGB(_root.rWechsel << 16 | _root.gWechsel << 8 | _root.bWechsel);
Für Player 6 funktioniert es, mit 7 schon nicht mehr. Ich vermute, es liegt an diesem kyrptischen "Längsstrich": | Meine Frage: was bedeutet "|" überhaupt? Und wie lautet die aktuelle Syntax dafür?
 
Es ist ein logischer Operator, der ODER bedeutet, und wenn du jeweils zwei zusätzliche Klammern um die Ausdrücke machst, funktioniert es auch wieder.

B
 
Zudem hat die bitweise Verschiebung (<<) eine höhere Rangfolge als das bitweise Oder (|), insofern sollten doch auch weitere Klammern unnötig sein?
Code:
_root.rWechsel << 16 | _root.gWechsel << 8 | _root.bWechsel
<<= entspricht =>>
(_root.rWechsel << 16) | (_root.gWechsel << 8) | _root.bWechsel

Gruß
.
 
Verstehe und danke, trotzdem hab ich bei mir noch irgendwo einen Hund drin, denn mit Player 7 gehts immer noch nicht.

Das ganze Skript geht so, auf einem MC liegt
PHP:
onClipEvent (enterFrame) {
    _root.rDiff = _root.rNew-_root.rBase;
    _root.rWechsel = _root.rDiff/8;
    _root.gDiff = _root.gNew-_root.gBase;
    _root.gWechsel = _root.gDiff/8;
    _root.bDiff = _root.bNew-_root.bBase;
    _root.bWechsel = _root.bDiff/8;
    farbWechsel = new Color("_parent.toppanel");
    farbWechsel.setRGB(_root.rWechsel << 16 | _root.gWechsel << 8 | _root.bWechsel);
    _root.rBase -= _root.rNew-_root.rWechsel;
    _root.gBase -= _root.gNew-_root.gWechsel;
    _root.bBase -= _root.bNew-_root.bWechsel;
    delete this.onEnterFrame;
}
und auf root die Farbzuweisung:
PHP:
_root.rNew = (71);
_root.gNew = (198);
_root.bNew = (255);
Wenn ich jetzt die nämliche Zeile ändere in
PHP:
farbWechsel.setRGB((_root.rWechsel << 16) | (_root.gWechsel << 8) | (_root.bWechsel));
gehts nimmer...

Bei dieser Gelegenheit gleich die Frage: macht das delete this... am Ende in diesem Fall Sinn? Schon, oder?

Und: kann man den Wechsel der Farbe, ausgelöst mit zb
PHP:
on (release) {
    _root.rNew = (183);
    _root.gNew = (122);
    _root.bNew = (239);
}
eigentlich auch vom Tempo her beeinflussen?
 
Hi,

der Fehler wird eher daraus resultieren, dass rBase, gBase und bBase auf _root nicht definiert sind (ab Flash 7 werden nicht definierte Variablen aus "undefined" behandelt, nicht mehr als 0). Initialisiere diese Werte also zusätzlich:
Code:
rNew = (71);
gNew = (198);
bNew = (255);

rBase = (0);
gBase = (0);
bBase = (0);

Das "delete this.onEnterFrame" hat an dieser Stelle keine Auswirkung und macht auch keinen Sinn, da die Funktion ja periodisch aufgerufen werden soll. Um Rechenzeit zu sparen, könnte man die onEnterFrame-Methode löschen, sobald die Zielfarbwerte erreicht sind, dann musst Du aber von "onClipEvent(enterFrame)" auf der Instanz Abstand nehmen und statt dessen eine onEnterFrame-Methode auf der Zeitleiste des Clips definieren.

Übrigens könntest Du mit der setTransform-Methode des Color-Objektes eine einfachere bzw. flexiblere Lösung erreichen (zudem lassen sich mehrfarbige Clips unterschiedlich stark einfärben; setRGB füllt ja den kompletten MC mit der entsprechenden Farbe). Hier ein Beispiel für einen kleinen Fade-Prototypen:
Code:
MovieClip.prototype.fadeTo = function(r, g, b, s) {
	var cl = new Color(this);
	var tr = cl.getTransform();
	for (var i in this) {
		if (this[i]._name == "fadeTo_CLP") removeMovieClip(this[i]);
	}
	var clp = this.createEmptyMovieClip("fadeTo_CLP", this.getNextHighestDepth());
	clp.onEnterFrame = function() {
		tr.rb += (r - tr.rb) / s;
		tr.gb += (g - tr.gb) / s;
		tr.bb += (b - tr.bb) / s;
		cl.setTransform(tr);
		var rs = Math.abs(r - tr.rb);
		var gs = Math.abs(g - tr.gb);
		var bs = Math.abs(b - tr.bb);
		if (rs < 1 && gs < 1 && bs < 1) {
			tr.rb = r;
			tr.gb = g;
			tr.bb = b;
			cl.setTransform(tr);
			delete this.onEnterFrame;
		}
	}
}

MovieClip.prototype.setTo = function(r, g, b) {
	var cl = new Color(this);
	var tr = cl.getTransform();
	for (var i in this) {
		if (this[i]._name == "fadeTo_CLP") removeMovieClip(this[i]);
	}
	tr.rb = r;
	tr.gb = g;
	tr.bb = b;
	cl.setTransform(tr);
}
Über den Parameter "s" kannst Du hierbei auch die Geschwindigkeit einstellen; je kleiner der Wert, desto schneller. ;)

Gruß
.
 
Hallo,

auf den ersten Bick fällt mir mal der falsche Paramter-Typ beim Color-Konstruktor auf. Meines Wissens akzeptiert der nur MovieClips und keine Strings.

gruss

EDIT:
zu spät ;)
 
@luke: Daran dachte ich zuerst auch, ein kleiner Test hat allerdings gezeigt, dass sogar Flash 8 so etwas anstandslos frisst. ^^

Gruß
.
 
@Tobi: Tatsächlich! Dabei wurde die Color-Klasse sogar verworfen :confused:. Naja, auf jeden Fall zwei tolle Prototypes, die du da gezimmert hast, Kompliment!

gruss
 
solche Prototypes setze ich bei vielen meiner Projekte ein (mit wechselnden Erweiterungen). Nützlich kann oft auch eine Callback-Funktion sein, die aufgerufen wird, wenn die Transformation abgeschlossen ist:
Code:
// z.B. bei einer Galerie eine Bildanzeige erst schnell
// überbelichten, dann abblenden:

picture.fadeTo(255, 255, 255, 1.5, onWhite);

function onWhite() {
    picture.fadeTo(0, 0, 0, 2);
}
Code:
// Prototype mit Callback:
MovieClip.prototype.fadeTo = function(r, g, b, s, _callback) {
	var cl = new Color(this);
	var tr = cl.getTransform();
	for (var i in this) {
		if (this[i]._name == "fadeTo_CLP") removeMovieClip(this[i]);
	}
	var clp = this.createEmptyMovieClip("fadeTo_CLP", this.getNextHighestDepth());
	clp.onEnterFrame = function() {
		tr.rb += (r - tr.rb) / s;
		tr.gb += (g - tr.gb) / s;
		tr.bb += (b - tr.bb) / s;
		cl.setTransform(tr);
		var rs = Math.abs(r - tr.rb);
		var gs = Math.abs(g - tr.gb);
		var bs = Math.abs(b - tr.bb);
		if (rs < 1 && gs < 1 && bs < 1) {
			tr.rb = r;
			tr.gb = g;
			tr.bb = b;
			cl.setTransform(tr);
			delete this.onEnterFrame;
			_callback();
		}
	}
}

P.S.: Meist verwende ich zusätzlich zu den drei Farbwerten r, g, b einen Parameter für die Alphatransparenz (a).
.
 

Neue Beiträge

Zurück