Tiefensortierung (Stapelreihenfolge) bei MovieClips [ab Flash 7]

Tobias Menzel

Erfahrenes Mitglied
Hallo,

mit dieser Funktion kann die Tiefensortierung einer Anzahl MovieClips indirekt festgelegt werden. So ist es z.B. möglich, bei dynamischen Größenänderungen größere Clips in den Vordergrund zu holen oder die Stapelungsreihenfolge in einer Pseudo-isometrischen Darstellung festzulegen.

Die betreffenden MovieClips werden der Methode in einem Array übergeben; die Tiefenebenen werden anhand der Position im Array festgelegt:
Code:
function sortDepths(siblings) {
	function siblSorted(arr) {
		var a = arr;
		var ok = true;
		for (var i=0; i<a.length - 1; i++) {
			if (a[i].getDepth() > a[i + 1].getDepth()) {
				ok = false;
				break;
			}
		}
		return ok;
	}
	var d = 0;
	while (!siblSorted(siblings) && d < siblings.length * 2) {
		d ++;
		for (var i=0; i<siblings.length - 1; i++) {
			var f1 = siblings[i];
			var f2 = siblings[i + 1];
			if (f1.getDepth() > f2.getDepth()) {
				f1.swapDepths(f2);
			}
		}
	}
}

Da die Position im Array entscheidend ist, muss das Array ggf. nach einem bestimmten Kriterium sortiert werden - dazu kann z.B. die sort-Methode in Verbindung mit einer Vergleichsfunktion dienen:
Code:
// 4 MovieClips anhand ihrer vertikalen Position (_y-Eigenschaft) in der Tiefe anordnen:

var clips = new Array(mc1, mc2, mc3, mc4); // Clips in einem Array aufnehmen

clips.sort(byY); // Array nach y-Position sortieren

sortDepths(clips); // Tiefenebenen festlegen

function byY(a, b) { // Vergleichsfunktion
	if (a._y > b._y) {
		return 1;
	} else if (a._y < b._y) {
		return -1;
	} else {
		return 0;
	}
}

Grüße,

Tobi
.
 
Ahoi Matze...

ich bin mit meinem Latein am Ende. Du scheinst ja da gut durchzusehen.
Ich habe auf einer Bühne 10 Movieclips attacht, wobei es sich immer um den gleichen Movieclip handelt der aber eine fortlaufende Nummer angehängt bekommt.
Über this.bg.getNextHighestDepth() werden die Clips in Ihrer Tiefe angeordnet. Sie skalieren sich, je größer ihr _y Wert, um so größer werden sie.
Soweit kommste ja mit. ^^

Nur bekomme ich es nicht gebacken, das die Clips sich auch so in der Tiefe verhalten. Der Movieclip mit dem höchsten _y Wert sollte auch vor den jeweiligen anderen MCs sein. Jeder Movieclip fragt am Besten seine Tiefe ab und korrigiert sie anhanf seines _y Wertes.


Mein Ansatz:

for (var i=1; i<10; i++)
{
if(this._y >= _root["andere Mcs"+i]._y)
{
this._parent.swapDepths(_root.getNextHighestDepth());
}
}


Liebe Grü0e

Ennobee
 

Anhänge

  • beebot.zip
    115,2 KB · Aufrufe: 20

Neue Beiträge

Zurück