Показать сообщение отдельно
Старый 09.04.2011, 18:05
BlooDHounD вне форума Посмотреть профиль Отправить личное сообщение для BlooDHounD Посетить домашнюю страницу BlooDHounD Найти все сообщения от BlooDHounD
  № 2  
Ответить с цитированием
BlooDHounD
стервочка (я мужик)
 
Аватар для BlooDHounD

блогер
Регистрация: Mar 2004
Адрес: Борисов
Сообщений: 3,161
Записей в блоге: 22
проще поворачивать в другую сторону. тогда и координаты и рейтинг сортировки высчитывается проще.
расчёт рейтинга становится элементарным: x + y. у кого это число больше - тот ближе к экрану. принцип оптимизации сортировки тоже очень прост: составляешь массив, в котором у тебя лежат объекты с их рейтингами. индекс элемента в массиве должен соответствовать его в глубине на сцене. в этом случаи алгоритм в общем виде будет выглядеть так:
Код AS3:
/**
 * @private
 * контейнер, в котором отображается всё наше барахло
 */
private var _content:DisplayObjectContainer;
 
/**
 * хэш, где хранятся соответствия модели их вьюхам
 * model -> view
 */
private const _elements:Dictionary = new Dictionary();
 
/**
 * @private
 * храним рейтинги сортировки
 */
private const _sortings:Vector.<uint> = new Vector.<uint>();
 
/**
 * @private
 * принудительно обновляет позицию вьюхи относительно модели
 */
private function updatePosition(data:MapElement):void {
 
	// получаем ссылку на вьюшку
	var view:DisplayObject = this._elements[ data ];
 
	var x:Number = data.x;
	var y:Number = data.y;
 
	// изменяем координаты вьюшки
	view.x = ( x - y ) * COOEF_X;
	view.y = ( x + y ) * COOEF_Y;
 
	// получаем текущий индекс
	var lastIndex:uint = this._content.getChildIndex( view );
	var lastRating:uint = this._sortings[ lastIndex ];
	// новый рейтинг
	var newRating:uint = Math.round( x + y ) + COOEF_SORT; // считаем новый рейтинг сортировки
	// если рейтинг не изменился, то ничего не делаем
	if ( lastRating != newRating ) {
		// удаляем себя из списка
		this._sortings.splice( lastIndex, 1 );
		// найдём куда ставить и поставим
		var newIndex:uint = this._sortings.length;
		while ( --newIndex ) {
			if ( this._sortings[ newIndex ] <= newRating ) break;
		}
		// вставляем новый индекс
		this._sortings.splice( i, 0, newRating );
		this._content.setChildIndex( view, newIndex );
	}
 
}
Добавлено через 1 минуту
код не тестировался и набросан прямо тут, но смысл я надеюсь передал. такой метод сортировки гарантирует, что не происходит постоянного перебора всех объектов, а сравниваются только рейтинги.


Последний раз редактировалось BlooDHounD; 09.04.2011 в 19:58.