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

Tetraeon 02.12.2012 14:20

Зигзаг сканирование (сортировка глубины)
 
Здравствуйте, данная тема не раз поднималась уже на форуме и я все их перечитал (или не понял), но так и не сумел придумать верный вариант сортировки изометрического редактора карт.
Вот к чему я пришел:
Код AS3:

            for (var col:int=0; col<slots; col++)
                        {
                                for (var row:int=0; row<slots; row++)
                                {
                                        for (var i:int=0; i<objArr.length; i++)
                                        {
                                                if (objArr[i] == grid[col][row].targ)
                                                {
                                                        container.addChild(objArr[i]);
                                                }
                                        }
                                }
                        }

Расположение клеток идет так: Х (col) с верхнего угла сетки вправо, а Y (row) влево.

Данный код сканирует изометрическую сетку по столбцам и добавляет находящиеся на клетках объекты поочередно вот в такой последовательности:
col row
0 0
0 1
0 2
1 0
1 1
1 2

Этот вариант не подходит для объектов имеющих огромные размеры (23x10) и т.д.
Я в тупике.. подскажите какие есть еще варианты?

SomeWater 04.12.2012 03:13

По моему ваш код и так заработает, на один цикл меньше и в n раз быстрее:
Код AS3:

            for (var col:int=0; col<slots; col++)
                        {
                                for (var row:int=0; row<slots; row++)
                                {
 
                                                if (grid[col][row].targ)
                                                {
                                                        container.addChild(grid[col][row].targ);
                                                }
                                }
                        }

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

Код AS3:

// каждый объект имеет координаты x,y и параметр zIndex
obj.x = 3;
obj.y = 34;
obj.zIndex = obj.x + obj.y * 10000;
 
// сортируем все объекты по zIndex
objArr.sortOn("zIndex", Array.NUMERIC)
 
// массив содержит уже отсортрованные объекты, просто добавляем
for each(var o in objArr)
  container.addChild(o)


Tetraeon 05.12.2012 10:31

Как можно применить ваш код если объект размером 23х10 ? Указывая X и Y объекта мы имеем ввиду точку регистрации изображения? В какую часть изображения нужно ставить точку регистрации?
У меня например на длинные объекты "налазят" высокие объекты. И как быть с обхектами чей zIndex будит равен и они будут пересикаться?

SomeWater 06.12.2012 00:59

Цитата:

У меня например на длинные объекты "налазят" высокие объекты
Этот алгоритм (как и ваш вышеприведенный) подходит, если все объекты одинаковые и квадратные. Если это не так, надо использовать более сложные алгоритмы. Посмотрите на http://code.google.com/p/as3isolib/
От размера поля ничего не зависит, у меня одномерный массив используется. Т.е. не нужно никакой инициализации согласно максимальному размеру. Ну если уж быть совсем точным, то максимальный размер поля получился (10000 - 1), но число 10000 случайное в принципе.
Под X,Y надо понимать верхнюю точку, т.е. наиболее близкую к началу координат. Начало координат обычно сверху располагается:
http://code.google.com/p/as3isolib/w...b_tutorial_005

Соответственно, у объекта есть его "экранные" координаты, ну обычные флешовые, которые отсчитываются от левого верхнего угла экрана. И координаты в пространстве (у кубика на ссылке выше координаты в пространстве например близки к 0,0 - т.е. он недалеко от начала координат).

У вас не будет объектов с одинаковым zIndex :) Это возможно только в том случае, если у двух объектов одни и те же координаты

Библиотека as3 isolib должна подойти для вашей задачи

Tetraeon 06.12.2012 14:04

Спасибо)


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

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