Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Сортировка отображения (http://www.flasher.ru/forum/showthread.php?t=203274)

taluks 12.09.2013 01:14

Сортировка отображения
 
как сделать что бы нормально отображались объекты и не дергались деревья ?(видео ниже)
Код AS3:

objects.sortOn("y");
for each (var obj:DisplayObject in objects)
addChild(obj);

получается вот это (видео)

in4core 12.09.2013 02:34

в коде ошибки нет. показывайте весь код

caseyryan 12.09.2013 06:36

Цитата:

Сообщение от in4core (Сообщение 1145994)
в коде ошибки нет. показывайте весь код

Вообще-то есть. В сортировке не указано, что значение "y" числовое, поэтому сортируется по строкам

Код AS3:

objects.sortOn("y", Array.NUMERIC);
var i:int = objects.length;
while (i--) {
        var childIndex:int = getChildIndex(objects[i]);
        if (childIndex != i) {
                setChildIndex(objects[i], i);
        }
}


in4core 12.09.2013 16:43

Цитата:

Вообще-то есть. В сортировке не указано, что значение "y" числовое, поэтому сортируется по строкам
Да это уже без разницы, в прикрепленном файле видна перетасовка, анимация и т.п. Здесь же показан частный единчиный случай, в котором такой зависимости быть не может

maxkar 12.09.2013 16:59

В документации по Array.sortOn (ну и в Array.sort, наверное, тоже) написано, что сортировка не стабильная (not stable). Так что порядок "равных" элементов может меняться.

Выходов два. Либо определить порядок так, чтобы он был стабильным (было меньше "равных" элементов). Либо использовать стабильную сортировку (написать ее руками).

caseyryan 12.09.2013 16:59

Цитата:

Да это уже без разницы
Разница, как раз таки есть

AlexCooper 12.09.2013 17:16

Код AS3:

arraySort.sort(mySort);
 
private function mySort(objA:Object, objB:Object) {
 
        if (objA.y<objB.y)
        {
                return 1;
        }
        else if (objA.y>objB.y)
        {
                return -1;
        }
        else
        {
                return 0;
        }
}
 
for ( var newDepth:uint=0; newDepth<arraySort.length; newDepth++)
        setChildIndex(arraySort[newDepth], newDepth);


KumoKairo 12.09.2013 17:24

По моему можно поменять алгоритм Z - сортировки немного: проверять и менять местами только объект героя и конкретное дерево, а не все объекты друг с другом.

Цитата:

Либо использовать стабильную сортировку (написать ее руками).
Можно просто предоставить другую функцию сортировки, которая проверят и Y и X объекта

Код AS3:

        objects.sort(myLittleZSorter);
        var i:int = objects.length;
        while (i--) {
                var childIndex:int = getChildIndex(objects[i]);
                if (childIndex != i) {
                        setChildIndex(objects[i], i);
                }
        }
 
        ...
        private function myLittleZSorter(a: Object, b: Object): int {
                if (a.y > b.y) {
                        return 1;
                } else if (a.y < b.y) {
                        return -1;
                } else if (a.x > b.x) {
                        return 1;
                } else {
                        return -1;
                }
        }

Тогда при сортировке не будут скакать элементы с одинаковым УГРИКОМ

in4core 12.09.2013 19:03

Цитата:

Разница, как раз таки есть
Да нет же, нет разницы! Я клоню к тому, что сортировку вообще можно и не делать для того когда, что был приведен. А вот в прикрепленном файле видно, как она будет работать если ее через таймер гонять - так причем тут первый код?* В нем как раз нет разницы, что написать, будет статическая картинка и все, пускай и не перетасованная, дело то не в этом.

P.s. - все там stable

GBee 13.09.2013 01:15

Вроде как for each не обещает правильный порядок следования


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

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