Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как сделать связь между Y и ChildIndex мувиклипа? (http://www.flasher.ru/forum/showthread.php?t=211898)

zCHESNOKz 02.12.2015 14:33

Как сделать связь между Y и ChildIndex мувиклипа? (Z-последовательность) #Решено
 
Всем привет! Помогите кому не лень)

Есть массив с клипами которые добавляются поочередно и также по ходу дела могут быть удалены. Мне же нужно что бы было так: чем больше у клипа Y тем меньше его позиция индекса в списке дочерних элементов относительно всех остальных клипов в массиве.

Как это реализовать?

#Решено! Спасибо callme

Код AS3:

 
addChild(clip);
plant_arr.push(clip);
 
clip_arr.sortOn("y", Array.NUMERIC);
 
for (var i:int = 0; i < clip_arr.length; i++)
{
        addChild(clip_arr[i]);
}

Если же у нас имеется вместо Array - Vector, в котором есть только .sort() можем написать свою сортировку:

Код AS3:

                        vector.sort(sorter);  
 
                        function sorter(a:T, b:T):Number
                        {
                                if(a > b) {
                                        return 1;
                                }
                                else if(a < b) {
                                        return -1;
                                }
                                else {
                                        return 0;
                                }
                        }


Tails 02.12.2015 14:54

Если массив имеется ввиду обычный массив или вектор, то у них есть метод sort, куда можно передать нужную функцию для сортировки.
Если надо сортировать детей DisplayObjectContainer, то придётся написать алгоритм сортировки самостоятельно. Пригодится метод swapChildrenAt.

zCHESNOKz 02.12.2015 19:33

Цитата:

Сообщение от Tails (Сообщение 1189346)
Если массив имеется ввиду обычный массив или вектор, то у них есть метод sort, куда можно передать нужную функцию для сортировки.
Если надо сортировать детей DisplayObjectContainer, то придётся написать алгоритм сортировки самостоятельно. Пригодится метод swapChildrenAt.

сортировка клипов: чем больше у клипа Y тем выше он в списке отображения.

только как?(

callme 02.12.2015 22:49

Код AS3:

var clips:Array = new Array();
 
var clip1:MovieClip = new MovieClip();
clip1.y = 10;
 
var clip2:MovieClip = new MovieClip();
clip2.y = 70;
 
var clip3:MovieClip = new MovieClip();
clip3.y = 50;
 
clips.push(clip1);
clips.push(clip2);
clips.push(clip3);
 
clips.sortOn('y', Array.NUMERIC);
 
for (var i:int = 0; i < clips.length; i++)
{
    addChild(clips[i]);
}


Tails 03.12.2015 10:15

callme,
Скорее всего, человеку нужно сортировать динамический список отображения, поэтому такой хитрый план с отдельным массивом не подойдёт. :)

zCHESNOKz,
Вам просто нужно обойти список отображения особым способом. То есть, используя один из алгоритмов сортировок. Готового решения у меня нету.

caseyryan 03.12.2015 10:25

Цитата:

Скорее всего, человеку нужно сортировать динамический список отображения, поэтому такой хитрый план с отдельным массивом не подойдёт.
Ну а что мешает обойти список и затолкать все в массив? А лучше вообще у контейнера, в который все это складывается, переопределить addChild / removeChild и добавлять / удалять всех детей стразу в массив сортировки

Tails 03.12.2015 10:35

Так и думал, что просто так от этого "лёгкого пути" не откажутся. :)
Список отображения уже является массивом. Зачем плодить ещё? Всё это будут костыли только ради использования нативного sort. Так код усложнится, потребление памяти и цп вырастет.

Правильным решением будет написать всего одну функцию, в которой реализовать подходящий алгоритм сортировки, с минимальными ресурсозатратами. Она потом на всю жизнь пригодится.

zCHESNOKz 03.12.2015 10:40

Цитата:

Сообщение от Tails (Сообщение 1189379)
callme,
Скорее всего, человеку нужно сортировать динамический список отображения, поэтому такой хитрый план с отдельным массивом не подойдёт. :)

zCHESNOKz,
Вам просто нужно обойти список отображения особым способом. То есть, используя один из алгоритмов сортировок. Готового решения у меня нету.

Именно, вы меня как раз таки поняли.

Это получается как в изометрии. Или там как то проще все считается?

Tails 03.12.2015 10:48

В изометрии ещё бывает, что к y прибавляют x. То есть сортируется как: 1.x + 1.y > 2.x + 2.y Это нужно для того, чтоб объекты стоящие на одинаковой y не "скакали" в списке отображения.

В играх код никогда не был простым.
Самое простое решение это сортировать элементы "каждый с каждым". Но понятное дело, что с такой сортировкой вы сможете показать на экране совсем не много объектов, перед тем как приложение начнёт фризить и виснуть. Поэтому, я дал вам ссылку на вики, где описываются различные алгоритмы сортировок. Нужно прочитать, изучить, выбрать самый оптимальный вариант под свои конкретные нужды и реализовать.

zCHESNOKz 03.12.2015 10:53

Цитата:

Сообщение от callme (Сообщение 1189368)
Код AS3:

var clips:Array = new Array();
 
var clip1:MovieClip = new MovieClip();
clip1.y = 10;
 
var clip2:MovieClip = new MovieClip();
clip2.y = 70;
 
var clip3:MovieClip = new MovieClip();
clip3.y = 50;
 
clips.push(clip1);
clips.push(clip2);
clips.push(clip3);
 
clips.sortOn('y', Array.NUMERIC);
 
for (var i:int = 0; i < clips.length; i++)
{
    addChild(clips[i]);
}



Я понял. Я тоже сортировал массив по 'y'. А дальше, как относительно положения в (отсортированном) массиве расположить графические объекты с нужным положением глубины отображения?


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

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