Просмотр полной версии : как сделать сортировку через swapDepth
Допустим есть обекты каждый со своей глубиной _z:
obj1._z=30 getDepth=1
obj2._z=10 getDepth=2
obj3._z=20 getDepth=3
Через sortOn я сортирую их по глубине _z. Получаю такое:
obj2._z=10 getDepth=2
obj3._z=20 getDepth=3
obj1._z=30 getDepth=1
А как мне используя только swapDepth расставить их по нужным уровням? Тоесть чтобы в результате на сцене получилось так:
obj2._z=10 getDepth=1
obj3._z=20 getDepth=2
obj1._z=30 getDepth=3
Если бы был метод setDepth то проблем бы не было:) Подскажите, пожалуйста, алгоритм.
Волгоградец
21.01.2009, 18:52
Если объекты - клипы, то и менять их глубину с помощью swapDepth(depth). Если не клипы - поместить их в клипы.
:) Это понятно что менять глубину. Но глубину надо изменять меняя клипы местами, а не назначая им глубину напрямую. Сталобыть на до как то хитро их перетасовать что бы они выстроились как в третьем примере.
Волгоградец
22.01.2009, 15:10
var tempMc:MovieClip = getInstanceAtDepth(1);
obj2.swapDepths(tempMc);
Или я опять неправильно понял?
:taunt::quiet:
Да знаю я как клипы местами менять:) Так ведь их нельзя просто нашару поменять все. Представь что их не 3 а 200. И у всех разная глубина. Нужен определенный алгоритм сортировки чтобы все их перестроить и не один не потерять. Это как большие пятнашки.
Добавлено через 1 час 34 минуты
Попробую сам дотумкать.
делаем асоциативный массив в который заносим имена всех наших мувиков, и их величину _z. Чтобы они были доступны вот так:
объект=my_array[i].obj
величина _z=my_array[i]._z
//затем сортируем массив по этой величине _z
my_array.sortOn(["_z"],Array.NUMERIC);
//далее играем в пятнашки
do {
r = 0;
//бежим по всем элементам
for (var i = 0; i<my_array.length; i++) {
//получаем реальную глубину ролика
var depth = my_array[i].obj.getDepth();
//если глубина не совпадает с порядковым номером в массиве свапим ролик на свое место
if (i<>depth) {
my_array[i].obj.swapDepths(my_array[depth].obj);
} else {
r++;
}
}
} while (r<my_array[i].length-2);
На небольших массивах работает отлично. А вот на больших... неочень. Пропускает некоторые элементы. Видимо алгоритм все равно не тот.
gloomyBrain
23.01.2009, 01:03
Я делал это почти так же. Только параллельными массивами, а не ассоциативным.
Идея в том, что есть 2 массива - в одном _z, в другом имена клипов(ну или id, или просто ссылки на клипы)
Так вот, сортируем массив с _z-ами, после чего с помощью
Array.RETURNINDEXEDARRAY
получаем, элемент с каким ИЗНАЧАЛЬНЫМ номером в массиве стоит на каком месте ТЕПЕРЬ
И ровно на эти же места (глубины) помещаем наши клипы из 2-ого массива
Волгоградец
23.01.2009, 10:47
А так если:
my_array.sortOn(["_z"],Array.NUMERIC);
for (var i:Number = 0; i < my_array.length; i ++) {
var tempMc:MovieClip = this.getInstanceAtDepth(i);
if(tempMc){
my_array[i].swapDepths(tempMc);
} else {
my_array[i].swapDepths(i);
}
}
Ан нет. Вычистил свои другие скрипты и оказалось что мой метод работает очень даже хорошо.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.