Will zu einem Frame springen nach While-Schleife

Z-r0

Erfahrenes Mitglied
Hallo zusammen!
Ich hab einen Movieclip der einen Maskeneffekt enthält und der wird dann x-mal dupliziert. Alles im ersten Frame. Hab diesen Effekt in einer fla in ähnlicher Form gefunden und dann für mich bearbeitet.
Doch in der Zeitleiste kommt ab frame 15 noch eine andere Animation und damit das nicht alles gleichzeitig abläuft hab ich im ersten frame natürlich ein stop();

Hier der Code:
Code:
function maskActivate(ebene) {
	if(ebene=="mc"){
		_root[(ebene + _root.i)].poX = 0;
		_root.i++;}
		
		
}

Stage.scaleMode = "noScale";
Stage.showMenu = false;

var mask_num = 20;
var intervalSpeed = 80;
var StageHeight = 500;
var StageWidth = 900;
var maskHeight = 100;
var maskWidth = 900;
var maskHeight = StageHeight / mask_num;
maskSrc._visible = 0;

i = 1;
z = 1;
while (z <= mask_num) {
	duplicateMovieClip("maskSrc", ("mc" + z),z );
	var obj = this[("mc" + z)];
	
	obj.mask._y = maskHeight * (z-1);
	obj.onEnterFrame = function() {
		this._x +=  (this.poX - this._x) *0.3 ;
	};
	obj._x = obj.poX = -maskWidth;
	z++;
		
	}

thetime = setInterval(maskActivate, intervalSpeed, "mc");

Wie kriege ich das jetzt am besten hin, dass nach ende der While Schleife er zu frame 15 springt und dann abspielt.

Außerdem würde ich gerne wissen, wie ich die Tiefen der Objekte festlege. Weil alles ab Frame 15 findet unter den ganzen Duplikaten statt. Und ist es möglich diese ganzen Duplikate auch noch zu löschen? Alle aufeinmal so im Frame 15?

Hoffe ihr versteht was ich meine und könnt mir helfen. Ich sitze schon die ganze Zeit dran aber komme einfach nicht weiter...:confused:
 
Hi,

Wie kriege ich das jetzt am besten hin, dass nach ende der While Schleife er zu frame 15 springt und dann abspielt.
Warum setzt Du dann nicht einfache eine gotoAndPlay-Aktion unter die Schleife?

Außerdem würde ich gerne wissen, wie ich die Tiefen der Objekte festlege. Weil alles ab Frame 15 findet unter den ganzen Duplikaten statt.
Alles, was Du zur Entwicklungszeit auf die Bühne gezogen hast, bekommt negative Tiefen zugewiesen. Mit swapDepths kannst Du Objekte wieder nach "oben" holen.

Und ist es möglich diese ganzen Duplikate auch noch zu löschen? Alle aufeinmal so im Frame 15?
Ja. Am einfachsten ist es, wenn Du die erstellten Duplikate in einem Array ablegst - es geht aber auch anders, wenn nur diese Duplikate nach dem Muster "mxX" benannt sind:
Code:
// in Frame 15:

for (var i in this) {
    if (typeof(this[i]) == "movieclip" && this[i]._name.substr(0, 2) == "mc") {
        this[i].removeMovieClip();
    }
}
Dieser Code entfernt alle MCs von der Hauptzeitleiste, deren Instanzname mit "mc" beginnt.

Gruß
.
 
Danke für die Hilfe Tobias!
Das mit den MCs löschen hat prima geklappt.

Das mit dem gotoAndPlay(15) kann ich nicht einfach nach der Schleife machen, er springt dann sofort zu frame 15. Eine Sache ist ja auch, dass das abarbeiten der Schleife ja ziehmlcih schnell geht aber die Animation noch ein bisschen länger dauert (ca 30frames)

Damit die Animation nicht in frame 15 durch das löschen der MCs abgebrochen wird soll er solange in Frame 1 bleiben, bis die ganze Animation beendet ist. Mein Code steht ja oben, wie mach ich das da?

und das mit swapDepths müsste ich dann für alle Objekte machen, die auf der Bühne waren?
Was ich wenn im Laufe der Zeitleiste noch Objekte dazukommen, müssen die dann auch alle mit swapDepths nach vorne geholt werden?
Kann man nicht einfach alle Duplikate nach hinten schieben, nachdem die Animation zuende ist?
 
Hi,

Du hast gesagt, es soll nach der Schleife weigergesprungen werden, nicht nach einer Animation. ;) Ich müsste wissen, um was es sich bei dieser Gesamtanimation handelt; davon ausgehend, dass es sich um die Bewegung der einzelnen Duplikate handelt, könntest Du das so überprüfen:
Code:
i = 1;
z = 1;

var amt = 0;

function nextFin() {
    amt ++;
    if (amt >= mask_num) {
        gotoAndStop(15);
    }
}

while (z <= mask_num) {
	duplicateMovieClip("maskSrc", ("mc" + z),z );
	var obj = this[("mc" + z)];
	
	obj.mask._y = maskHeight * (z-1);
	obj.onEnterFrame = function() {
		this._x +=  (this.poX - this._x) *0.3 ;
		if (Math.abs(this.posX - this._x) < 1) nextFin();
	};
	obj._x = obj.poX = -maskWidth;
	z++;
		
}

Du solltest übrigens das Intervall, mit dem Du die Funktion "maskActivate" aufrufst, dort auch wieder löschen, sonst wird die Funktion bis in alle Ewigkeit alle 80 Millisekunden aufgerufen ...

Da die manuell auf die Bühne gezogenen Objekte standardmäßig die niedrigesten möglichen Tiefen erhalten, kannst Du Deine neuen Clips leider nicht darunter setzen.

Als Lösung bliebe Dir nur, den Clip "maskSrc" (und damit auch alle seine Duplikate) in einen Container zu packen, der standardmäßig unter allem anderen liegt.

Gruß
.
 
Danke nochmal Tobias!

Also ich verstehe was die funktion nextfin bewirken soll aber das mit der Math.abs sache kapier ich nicht. Ich dachte immer das Ergebnis austhis.posX - this._x ist immer kleiner als 1 und deshalb fährt er ja die function nextfin() gleichzeitig mit der animation ab.
Dadurch wechselt er schon vor ende der animation zu frame 15, weil es ja nicht so lange dauert bis amt > 20 ist.

Und die Animation ist echt einfach nur eine verzögerte Bewegung der Duplikate, die dann ein Gesamtbild am ende der Animation ergeben.
 
Hiermit:
Code:
this._x +=  (this.poX - this._x) *0.3 ;
machst Du folgendes: Du hast einen Zielwert (poX) und den aktuellen (this._x), wobei Du die tatsächliche Position verzögert der Zielposition anpasst. Ist der Abstand zwischen momentaner Position und Zielposition hinreichend klein (in der Regel ist das der Fall,wenn der Abstand weniger als 1 Pixel beträgt), kann man die Animation als beendet ansehen und die Funktion "nextFin" für diesen MC aufrufen.

Wenn das bei Dir nicht funktioniert, bräuchte ich zum Testen die Originaldatei (.fla) - ich kann ja nicht wissen, welchen Wert z.B. poX zu Beginn hat.

Gruß
.
 
Danke für die Antwort!

Aber was ich nicht verstehe ist, dass ich dachte this_x ist bei mir anfangs 0 und wird dann immer kleiner also in minus Bereich.
Lässt du mir deine Email Addresse zukommen? Dann könnte ich dir die fla schicken.

ciao!
 
Hi,

es ist egal, ob _x oder poX negative Werte einnehmen - als Vergleich wird eh der Absolutwert herangezogen, so dass es keine Rolle spielt, welcher der beiden Werte der größere ist.

PN mit Adresse ist unterwegs.

Gruß
.
 
Hi,

mehrere Fehler:
  1. (das war meiner) muss die onEnterFrame-Methode beendet werden, bevor nextFin aufgerufen wird, da jedes Objekt diese Methode ansonsten immer wieder aufruft.

  2. Du legst die Zielposition (posX) erst in der Funktion "maskActivate" für jedes Duplikat fest; erst zu diesem Zeitpunkt beginnt die Animation. Startest Du die onEnterFrame-Methode aber sofort, so gleichen sich Start- und Zielposition zunächst, was zum (fälschlichen) Aufruf von nextFin führt.

  3. Hattest Du m.E. kein stop() in Frame 1 stehen. ;)

Probiers mit diesem Code:
Code:
fscommand("allowscale", "false");

function maskActivate(ebene) {
	if(ebene=="mc"){
		_root[(ebene + _root.i)].posX = 0;
		_root[(ebene + _root.i)].onEnterFrame = function() {
			this._x +=  (this.posX - this._x) *0.3 ;
			if (Math.abs(this.posX - this._x) < 1) {
				delete this.onEnterFrame;
				nextFin();
			}
		}
		_root.i++;
	}
}

Stage.scaleMode = "noScale";
Stage.showMenu = false;

var amt = 0;

function nextFin() {
    amt ++;
    if (amt >= mask_num) {
        gotoAndPlay(15);
    }
}

var mask_num = 20;
var intervalSpeed = 80;
var StageHeight = 500;
var StageWidth = 900;
var maskHeight = 100;
var maskWidth = 900;
var maskHeight = StageHeight / mask_num;
maskSrc._visible = 0;

i = 1;
z = 1;
while (z <= mask_num) {
	duplicateMovieClip("maskSrc", ("mc" + z),z );
	var obj = this[("mc" + z)];
	
	obj.mask._y = maskHeight * (z-1);
	obj._x = obj.posX = -maskWidth;
	z++;
		
	}

thetime = setInterval(maskActivate, intervalSpeed, "mc");


stop();

Gruß
.
 
Zurück