Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   как сделать сортировку через swapDepth (http://www.flasher.ru/forum/showthread.php?t=120476)

ВАРАН 21.01.2009 18:42

как сделать сортировку через 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 13:35

:) Это понятно что менять глубину. Но глубину надо изменять меняя клипы местами, а не назначая им глубину напрямую. Сталобыть на до как то хитро их перетасовать что бы они выстроились как в третьем примере.

Волгоградец 22.01.2009 15:10

Код AS1/AS2:

var tempMc:MovieClipgetInstanceAtDepth(1);
obj2.swapDepths(tempMc);

Или я опять неправильно понял?

ВАРАН 22.01.2009 18:18

:taunt::quiet:
Да знаю я как клипы местами менять:) Так ведь их нельзя просто нашару поменять все. Представь что их не 3 а 200. И у всех разная глубина. Нужен определенный алгоритм сортировки чтобы все их перестроить и не один не потерять. Это как большие пятнашки.

Добавлено через 1 час 34 минуты
Попробую сам дотумкать.
делаем асоциативный массив в который заносим имена всех наших мувиков, и их величину _z. Чтобы они были доступны вот так:
объект=my_array[i].obj
величина _z=my_array[i]._z


Код AS1/AS2:

//затем сортируем массив по этой величине _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-ами, после чего с помощью
Код AS1/AS2:

Array.RETURNINDEXEDARRAY

получаем, элемент с каким ИЗНАЧАЛЬНЫМ номером в массиве стоит на каком месте ТЕПЕРЬ
И ровно на эти же места (глубины) помещаем наши клипы из 2-ого массива

Волгоградец 23.01.2009 10:47

А так если:
Код AS1/AS2:

my_array.sortOn(["_z"],Array.NUMERIC);
for (var i:Number = 0; i < my_array.length; i ++) {
  var tempMc:MovieClipthis.getInstanceAtDepth(i);
  if(tempMc){
      my_array[i].swapDepths(tempMc);
  } else {
      my_array[i].swapDepths(i);
  }
}


ВАРАН 23.01.2009 12:08

Ан нет. Вычистил свои другие скрипты и оказалось что мой метод работает очень даже хорошо.


Часовой пояс GMT +4, время: 23:54.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.