as syntax - längsstrich

Ganz toll, Tobias, aber bitte erklärs mal für Nitwits: kommt das Skript auf die Zeitleiste? Oder ein Teil davon auf den Clip? Und wie tu ich, wenn ich mehreren Clips, die mit dem Zauberwerk ausgestattet sind, zugleich, quasi zentral durch einen Buttondruck gesteuert, eine neue Farbe zuweisen will? Pretty please...
 
Hi,

den Prototype setzt Du einmal an zentraler Stelle (z.B. in den ersten (ab besten einzigen ;) ) Frame der Hauptzeitleiste). Die entsprechende Funktion steht dann als Methode allen MovieClips zur Verfügung. Der Aufruf erfolgt für einen beliebigen MC über Instanzname.fadeTo(rot, grün, blau, teiler);. Beispiel, um drei MovieClips nach rot überzublenden:
Code:
clip1.fadeTo(255, -255, -255, 4);
clip2.fadeTo(255, -255, -255, 10); // etwas langsamer
clip3.fadeTo(255, -255, -255, 16); // noch langsamer ...

Gruß
.
 
Toll! Für mich, ein AS2-Kind, immer wieder erhellend zu sehen, wie potent im Prinzip schon v1 war.

Ist nun zwar :offtopic::
Wenn du nun als callback eine Funktion übergeben willst, die noch Parameter benötigt und du die schon beim Auruf der "Mutter-Funktion" mitgeben willst, deren Anzahl bzw Vorhandensein nun aber dynamisch ist, wie baust du das in so eine AS1-Prototype-Klasse? (Was ein Monstersatz ;))

gruss
 
Hi,

man könnte die Callback-Parameter in einem Objekt speichern, dass als zusätzliches Argument der Prototypemethode übergeben wird:
Code:
MovieClip.prototype.fadeTo = function(r, g, b, s, _callback, _args) {
	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(_args);
		}
	}
}

var args = {foo:17, bar:4};

clip.fadeTo(255, -50, -150, 3, onTest, args);

function onTest(args) {
	for (var i in args) {
		trace(i + " -> " + args[i]);
	}
}
Nachteil: Mir ist keine Möglichkeit eingefallen, das args-Objekt vor dem Aufruf der Callbackfunktion zu zerlegen und die Originalparameter mitzugeben (u.A. weil eval() keine Funktionsaufrufe unterstützt), daher muss das die Callbackfunktion selbst erledigen. Eine andere Variante wäre, die Parameter dem Prototype einfach mit zu übergeben, dann muss die Parameteranzahl allerdings bekannt sein (bzw. ein großzügiger Maximalwert festgelegt werden).

Gruß
.
 
Klappt perfekt, innigen Dank! Ist ja viel besser - und geht auch nicht so auf die Leistung, wenn ich recht verstehe.
 
Nochmals :offtopic::

@Tobi:

Hiermit kannst du ohne Objekt-Parameter und ähnlichen Krampf die Anzahl Parameter, die an eine Funktion übergeben wurden, abrufen.


PHP:
function parameterTest () {
     var i = arguments.length;
     trace ("Anzahl Parameter: "+i);
     while(i--) {
        trace (arguments[i]);
     }
}

parameterTest("tu", "to", "rials", ".de");

In der Referenz findest du das schicke Teil unter Arguments-Klasse

gruss
 
Hi,

das ist mir bekannt - bringt aber m.E. in dieser Situation nichts: Es ging ja darum, die Callbackfunktion mit ihren Parametern in der Form _callback([param1[, param2[, param3[, ..]]]]); aufzurufen. ;)

Es stimmt allerdings, dass man mit der Arguments-Klasse komfortabel die Anzahl der Parameter herausfinden kann - problematisch wird es, einer Funktion eine variable Anzahl Parameter in der oben genannten Form mitzugeben, egal wie diese vorliegen (ob als Objekt oder als Array).

Gruß
.
 
Hmmmm...das stimmt. :(

Aber es gibt bestimmt ne Möglichkeit. Weisst du z.B. wie das bei setInterval läuft, der übergibt man doch auch erst die Funktion, dann das Interval und dann beliebig viele Parameter, mit denen dann die Funktion geloopt wird.

gruss
 
Hi,

ja, so ähnlich hätte ich mir das auch vorgestellt. Ich nehme aber an, dass sich um eine Playerinterne Verarbeitung handelt, die sich mit "Boardmitteln" nicht nachbauen lässt.

In anderen Scriptsprachen würde ich die Parameter als String zusammensetzen: var arg_str = arg1 + ", " + arg2 + ", " + arg3; und die Funktion evaluieren lassen: eval("Funktionsname(" + arg_str + ")");, was Flash nicht erlaubt.

Stutzig machte mich zudem die Tatsache, dass z.B. in der Referenz unter "Function.call" die Parameter als ein Argument vom Typ Object angegeben werden:
Referenz hat gesagt.:
public call(thisObject:Object, [parameter1:Object]) : Object
- allerdings werden auch hier nur durch Kommata getrennte Parameter akzeptiert (bzw. ist es mir nicht gelungen, ein Objekt zusammenzubauen, dass im Funktionskörper in Form mehrerer Parameter zur Verfügung steht).

Gruß
.
 

Neue Beiträge

Zurück