Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 15.05.2013, 16:01
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 1  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
По умолчанию Сортировка дисплей объектов

Необходимо сортировать дисплей объекты по оси y в реальном времени так, чтобы чем ниже был объект, тем выше он бы был в дисплей листе.

Сложность заключается в том, что объекты имеющие одинаковую координату y, находящиеся рядом друг с другом - периодически перекрывают себя, то один то другой выходит на более верхний уровень отображения чем его сосед.

Сортировка по одной только оси y не подходит. Перед тем как думать над более сложным алгоритмом, может, кто-то уже делал такое или знает как проще?
__________________
Дети не должны знать о своих родителях

Старый 15.05.2013, 16:34
relevance4 вне форума Посмотреть профиль Отправить личное сообщение для relevance4 Посетить домашнюю страницу relevance4 Найти все сообщения от relevance4
  № 2  
Ответить с цитированием
relevance4

Регистрация: Nov 2006
Адрес: там
Сообщений: 468
Отправить сообщение для relevance4 с помощью ICQ
sortvalue = y * 10000 + x
вместо икса ширину можно, а вместо 10k любое значение исключающее повторы

Старый 15.05.2013, 16:57
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 3  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Да, на ум ток координата x приходит, как наиболее адекватное уникальное значение. Кому интересно, вот итоговый класс для сортировки:
Код AS3:
package mvc.view.map 
{
	import flash.display.DisplayObject;
	import flash.display.DisplayObjectContainer;
 
 
	/**
	 * Сортировщик дисплей объектов по оси y.
	 * Чем выше координата y тем ниже в списке отображения объект.
	 * 
	 * @author Tails
	 */
	public class Sorter{
 
		// Приват
		private var _contaner:DisplayObjectContainer;
 
		public function Sorter() {
		}
 
 
		// ГЕТТЕР-СЕТТЕРЫ
		/** Контейнер сортируемых объектов. **/
		public function get sorterContaner():DisplayObjectContainer {
			return _contaner;
		}
		public function set sorterContaner(value:DisplayObjectContainer):void {
			_contaner = value;
		}
 
 
		// ПАБЛИК
		/** Сортировать объекты. **/
		public function sort():void {
			if (!_contaner)
				throw new Error(this + ' Сортировочный контейнер не выбран.');
 
			var length:uint	= _contaner.numChildren;
			if(length > 1)
				qSort(_contaner, 0, length - 1);
		}
 
 
		/**
		 * Алгоритм быстрой сортировкки.
		 * http://ru.wikipedia.org/wiki/%D0%91%...B2%D0%BA%D0%B0
		 */
		private function qSort(a:DisplayObjectContainer, low:int, high:int):void {
			var i:int 					= low;                
			var j:int 					= high;
			var child:DisplayObject		= a.getChildAt(int((low + high) / 2));
			var x:Number 				= child.y + child.x * 0.00001;  // x - опорный элемент посредине между low и high
			do {
				while(a.getChildAt(i).y + a.getChildAt(i).x * 0.00001 < x) ++i;  // поиск элемента для переноса в старшую часть
				while(a.getChildAt(j).y + a.getChildAt(j).x * 0.00001 > x) --j;  // поиск элемента для переноса в младшую часть
				if(i <= j){           
					// обмен элементов местами:
					a.swapChildrenAt(i, j);
 
					// переход к следующим элементам:
					i++; j--;
				}
			} while(i < j);
			if(low < j) qSort(a, low, j);
			if(i < high) qSort(a, i, high);
		}
 
	}
}
__________________
Дети не должны знать о своих родителях

Старый 16.05.2013, 00:13
FieryWall вне форума Посмотреть профиль Отправить личное сообщение для FieryWall Найти все сообщения от FieryWall
  № 4  
Ответить с цитированием
FieryWall
 
Аватар для FieryWall

Регистрация: Nov 2010
Сообщений: 190
Отправить сообщение для FieryWall с помощью ICQ Отправить сообщение для FieryWall с помощью Skype™
Если модуль разницы y-координат контейнеров меньше некого минимума - не предпринимаю никаких действий, а к x - координате привязываю порядок чтения контейнеров

Старый 16.05.2013, 00:58
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 5  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Tails, попробуй связный список а не сортировку. То есть вместо того чтобы сортировать ВСЕ объекты, можно лишь двигать те, что поменяли координаты. Быстрее во много раз. Идеально для твоего случая.
__________________
...вселенская грусть

Старый 16.05.2013, 01:12
mikhailk вне форума Посмотреть профиль Отправить личное сообщение для mikhailk Найти все сообщения от mikhailk
  № 6  
Ответить с цитированием
mikhailk
 
Аватар для mikhailk

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
Цитата:
То есть вместо того чтобы сортировать ВСЕ объекты, можно лишь двигать те, что поменяли координаты.
Перс ходит по лесу между деревьями. Как сортировать будем, если деревья координат не меняют? Или я не понял идеи?

По сабжу - я тоже при сортировке по y дополнительно использовал значение x, чтобы исключить неоднозначность ситуации, когда рядом стоят два объекта с одним y.

Старый 16.05.2013, 01:54
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 7  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
gloomyBrain,
В таком случае, мы сможем сэкономить только на формирований некого списка для порядка вывода статических объектов на экран. Всё равно придётся дёргать статичные дисплей объекты в контейнере при выводе списка динамических и статических объектов. Сперва я что-то такое хотел сделать.

Способ с сортировкой кажется более простым и возможно более быстрым, так-как перебираются объекты довольно быстро, а свапаются только изменившие координаты. В целях оптимизаций, если понадобиться, можно сделать сортировку только объектов на экране.

Всё познаётся в сравнений, если у кого-то есть другой реализованный способ сортировки, можно было-бы сравнить результаты тестов
__________________
Дети не должны знать о своих родителях

Старый 16.05.2013, 02:41
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 8  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Цитата:
Перс ходит по лесу между деревьями. Как сортировать будем, если деревья координат не меняют? Или я не понял идеи?
0) объект добавлен на карту -> назначаем ему индекс глубины (Number, например object.x + object.y * 1000)
1) объект поменял координаты -> заносим его в список апдейтов
2) раз в кадр проходим по всему списку объектов
3) Для каждого объекта в списке
- вычисляем индекс глубины заново
- сравниваем свой индекс с индексом соседа "сверху"
- если у соседа индекс такой, что он должен быть "снизу", спрашиваем следующего
- повторяем до тех пор, пока список "вверх" не заканчивается или пока не находим того, кто точно должен быть "сверху" от нас после апдейта

... то же самое "вниз" если нужно

... setChildIndex перемещает только один объект

Стоит учесть, что на практике объекты не прыгают через всю карту, а значит количество шагов вверх или вниз всегда небольшое. Вычислений реально мало. Количество объектов на экране вообще значения не имеет (в отличие от quickSort), важно только сколько из них передвинулось. Вру конечно про "не имеет", но можно пренебречь, когда попробуете сами увидите.

Это называется сортировка вставками и на данных, которые уже отсортированы она показывает офигитительные результаты, смотрите сами:
http://www.sorting-algorithms.com/
__________________
...вселенская грусть

Старый 16.05.2013, 14:20
mikhailk вне форума Посмотреть профиль Отправить личное сообщение для mikhailk Найти все сообщения от mikhailk
  № 9  
Ответить с цитированием
mikhailk
 
Аватар для mikhailk

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
Цитата:
раз в кадр проходим по всему списку объектов
3) Для каждого объекта в списке
- вычисляем индекс глубины заново
Ну, если для каждого все равно вычисляем...
Я уж думал, откровение какое свершилось.

Создать новую тему Ответ Часовой пояс GMT +4, время: 19:38.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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