[ascoders] AW: AW: AW: FL5: _depth
- From: "Till Schneidereit" <zooey@xxxxxxx>
- To: <ascoders@xxxxxxxxxxxxx>
- Date: Wed, 30 Oct 2002 23:13:57 +0100
hi alex,
du hast recht, natürlich sollte die attachMovie-funktion ersetzt werden,
um normales attachen zu verhindern, gute veränderung.
das removeMovieClip sollte kein problem sein, folgender code sollte
ausreichen:
//code
MovieClip.prototype.attachClip = MovieClip.prototype.attachMovie;
MovieClip.prototype.attachMovie = function(id, newname, tiefe, obj) {
if (typeof (this.tiefen) != "object") {
this.tiefen = new Array();
}
while (true) {
if (typeof (this.tiefen[tiefe]) == "movieclip") {
tiefe++;
} else {
break;
}
}
this.attachClip(id, newname, tiefe, obj);
this.tiefen[tiefe] = this[newname];
//neue variable, die angibt, in welcher tiefe der clip sich
befindet.
this[newname]._tiefe = tiefe;
return tiefe;
};
MovieClip.prototype.removeClip = MovieClip.prototype.removeMovieClip;
MovieClip.prototype.removeMovieClip = function(){
this._parent.tiefen.splice(this._tiefe, 1);
this.removeClip();
}
trace(_root.attachMovie("b", "b1", 10));
b1._x = 150;
trace(_root.attachMovie("b", "b2", 10));
b2._y = 200;
trace(_root.attachMovie("b", "b3", 10));
b3._x = 300;
_root.b2.removeMovieClip();
//codeende
damit wird auch der eintrag im array gelöscht, wobei das problem ist,
daß ein neuer clip damit zwischen zwei alten eingefügt werden könnte und
damit nicht mehr als oberstes zu sehen ist. im vorliegenden beispiel
würde ein weiterer clip mit tiefenangabe 10 zwischen b1 und b3 eingefügt
werden.
um dieses problem zu umgehen, müßte man beim remove das array so lange
nach oben durchgehen und alle clips eine ebene tiefer switchen bis eine
lücke im array auftritt.
ein weiteres problem ist, daß es mit diesem code nicht mehr möglich ist,
einen schon vorhandenen clip gezielt zu ersetzen. dazu müßte ein
weiterer parameter eingeführt werden, der das ermöglicht. problem dabei
ist, daß attachMovie ja noch den weiteren parameter unterstützt
(activationObject). um den parameter zum überschreiben zu benutzen,
müßte er also noch nach das activationObject gesetzt werden, selbst wenn
keins übergeben werden soll. ein aufruf könnte dann so aussehen:
_root.attachMovie("b", "b1", {}, true);
!achtung, funktioniert momentan natürlich nicht, da die auswertung des
parameters nicht implementiert ist.
eine viel einfachere lösung ist eigentlich, den original-attach befehl
zu benutzen und dann den _tiefe-parameter manuell zu setzen.
beispiel:
_root.attachClip("b", "b1", 10);
_root.b1._tiefe=10;
grüße,
till
-----Ursprüngliche Nachricht-----
Von: ascoders-bounce@xxxxxxxxxxxxx
[mailto:ascoders-bounce@xxxxxxxxxxxxx] Im Auftrag von Alex Uhlmann
Gesendet: Mittwoch, 30. Oktober 2002 22:06
An: ascoders@xxxxxxxxxxxxx
Betreff: [ascoders] AW: AW: FL5: _depth
@Martin Fleck: Ich habe von dir einen alten Thread gefunden:
http://groups.google.com/groups?q=_depth+group:macromedia.general.german
y&hl=en&lr=&ie=UTF-8&safe=off&selm=980tuh%24qbk%241%40misc.macromedia.co
m&rnum=1
Leider gibt es die URL von were-here.com nicht mehr. Weißt du noch worum
es da genau ging?
@Timm Stamm: Sorry wg. HTML mail.
Hi Till,
danke für dein Script. Ich habs für attachMovie umgeschrieben. So siehts
aus:
MovieClip.prototype.attachClip = function(id,newname,tiefe)
{
if(typeof(this.tiefen)!="object")
{
this.tiefen = new Array();
}
while(true)
{
if(typeof(this.tiefen[tiefe])=="movieclip")
{
tiefe++;
}
else
{
break;
}
}
this.attachMovie(id,newname,tiefe);
this.tiefen[tiefe]=this[newname];
return tiefe;
}
//:BUG: ball wird zwar in Tiefe 10 attacht allerdings durch das folgende
attachClip wieder ersetzt.
_root.attachMovie("ball","ball1",10);
trace(_root.attachClip("b","b1",10));
b1._x = 150;
trace(_root.attachClip("b","b2",10));
b2._y = 200;
trace(_root.attachClip("b","b3",10));
b3._x = 300;
Und hier siehst du schon mein Problem, das du auch angesprochen hast. Da
man nicht die Tiefe abfragen kann muss jede attachMovie Funktion über
attachClip laufen um registriert zu werden. Der User darf einfach nicht
attachMovie im gleichen Objekt und gleicher Tiefe verwenden. ):
Und damit er das auch nicht macht, hier ein Lösungsansatz. Ich
überschreibe attachMovie mit dem Inhalt deiner attachClip Funktion.
Vorher speichere ich die alte attachMovie in a.
MovieClip.prototype.a = MovieClip.prototype.attachMovie;
MovieClip.prototype.attachMovie = function(id,newname,tiefe)
{
if(typeof(this.tiefen)!="object")
{
this.tiefen = new Array();
}
while(true)
{
if(typeof(this.tiefen[tiefe])=="movieclip")
{
tiefe++;
}
else
{
break;
}
}
this.a(id,newname,tiefe);
this.tiefen[tiefe]=this[newname];
return tiefe;
}
trace(_root.attachMovie("ball","ball1",10));
trace(_root.attachMovie("b","b1",10));
b1._x = 150;
trace(_root.attachMovie("b","b2",10));
b2._y = 200;
trace(_root.attachMovie("b","b3",10));
b3._x = 300;
Damit werden jetzt alle MCs attached.
Problem dabei ist, dass der Array "tiefen" immer größer wird. Wenn der
attachte und in "tiefen" gespeicherte MC also wieder gelöscht wird,
sollte er auch aus dem tiefen Array verschwinden. Also müsste man auch
die removeMovieClip Funktion umschreiben. Wenn der Frame mit dem
attacheten Inhalt einfach zu Ende ist, dann müsste auch aus dem "tiefen"
Array gelöscht werden. Letzteres ist glaube ich nicht möglich.
Gruß
Alex
------------------------------------------------------
Archiv : http://www.freelists.org/archives/ascoders/
Optionen : http://www.freelists.org/list/ascoders
------------------------------------------------------
------------------------------------------------------
Archiv : http://www.freelists.org/archives/ascoders/
Optionen : http://www.freelists.org/list/ascoders
------------------------------------------------------
- Follow-Ups:
- [ascoders] AW: AW: AW: AW: FL5: _depth
- From: Alex Uhlmann
- References:
- [ascoders] AW: AW: FL5: _depth
- From: Alex Uhlmann
Other related posts:
- » [ascoders] AW: AW: AW: FL5: _depth
- [ascoders] AW: AW: AW: AW: FL5: _depth
- From: Alex Uhlmann
- [ascoders] AW: AW: FL5: _depth
- From: Alex Uhlmann