Форум 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=174032)

windrunner31 16.01.2012 18:45

Как сделать сортировку по координатам.
 
В общем проблема:я в данный момент делаю игру,и там появилась задача сделать так,чтобы юнит с меньшим y(ниже по экрану) всегда закрывал юнита с более высоким y(выше по экрану),как это сделать?Ведь обычно позднее созданный юнит закрывает ранее созданного,а мне это не нужно!=)

iNils 16.01.2012 18:59

После знаков препинания ставится пробел.

windrunner31 16.01.2012 19:20

окей, но это не очень помогает моей проблеме=)

artcraft 16.01.2012 19:26

1. сложить ссылки на все объекты в один массив
2. посортировать объекты в этом масссиве по свойству .y
3. поменять глубину каждого объекта согласно новой позиции в массиве

Stitch512 16.01.2012 19:57

Как вариант
Код AS3:

private function reorder(): void
                {
                        var iS:Boolean = true;
                        var i: int;
                        var n: int = _childs.length;
                        while(iS)
                        {
                                iS = false;
                                for (i = 1; i < n; i++)
                                {
                                        if (_childs[i - 1].y > _childs[i].y)
                                        {
                                                this.swapChildren(_childs[i], _childs[i - 1]);
 
                                                var tmp: DisplayObject = _childs[i];
                                                _childs[i] = _childs[i - 1];
                                                _childs[i - 1] = tmp;
 
                                                iS = true;
                                        }
                                }
                        }
                }

Тупая, но рабочая сортировка пузырьком, при небольшом кол-ве объектов вполне приемлемо (выдрал из кода, для вашего случая возможно нужно поменять знак сравнения, не проверял).

Vektor 16.01.2012 20:15

4. Разбить карту, на более на более мелкие зоны.
Но эта не лучшая идея, так как персонаж двигается, придется в каждом кадре, это повторять.
Лучше двигать, персонажа по массиву (с координатой Y)и менять только глубину персонажа, там надо будет делать проверки, сделать это будет не просто, но можно.
вот этой функцией менять глубину.
setChildIndex();
С объектами примерно также, проверяешь координаты по Y, проверяешь, в какую ячейку массива он попадет, и ставишь объект на нужную глубину, все остальные объекты выше вставляемого объекта сами поменяют глубину.

iNils 16.01.2012 20:17

Цитата:

Сообщение от windrunner31 (Сообщение 1057283)
окей, но это не очень помогает моей проблеме=)

Это помогает процессу чтения. И то что я написал, нужно исправить, а не отшучиваться.
Вы выполняете правила и требования модераторов - вам помогают, а не наоборот.

goodguy 16.01.2012 21:13

Я такой способ юзаю.
Код AS3:

private function arrange():void {
        var sortedItems:Array = [];
        var i:int = numChildren;
        while (i--) {
                sortedItems.push(getChildAt(i));
        }
 
        sortedItems.sortOn("y", Array.NUMERIC);
        i = sortedItems.length;
        while(i--){
                if (getChildIndex(sortedItems[i]) != i) {
                        setChildIndex(sortedItems[i], i);
                }
        }
}

(естественно нужно подстваить в код нужный контейнер)
Для увеличения скорости сортировки, можно менять глубину (в дисплей листе) только заданного объекта


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

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